web-dev-qa-db-fra.com

générer un nombre aléatoire compris entre 1 et 10 en c

#include <stdio.h>
#include <stdlib.h>

int main()

{
    int randomnumber;
    randomnumber = Rand() % 10;
    printf("%d\n", randomnumber);
    return 0;
}

Il s'agit d'un programme simple dans lequel randomnumber est une variable int non initialisée destinée à être imprimée sous forme de nombre aléatoire compris entre 1 et 10. Cependant, il imprime toujours le même nombre à chaque fois que je lance encore et encore. Quelqu'un peut-il s'il vous plaît aider et me dire pourquoi cela se produit? Je vous remercie. 

12
Nisarg

Vous avez besoin d'une graine différente à chaque exécution.

Vous pouvez commencer à appeler au début de votre programme:

srand(time(NULL));

Notez que % 10 génère un résultat de 0 à 9 et non de 1 à 10: ajoutez simplement 1 à votre expression % pour obtenir 1 à 10.

14
ouah

Vous devez initialiser le générateur de nombres aléatoires, à partir de man 3 Rand 

Si aucune valeur de départ n'est fournie, la fonction Rand () est automatiquement ensemencée avec la valeur 1.

et

La fonction srand () définit son argument comme germe pour une nouvelle séquence d'entiers pseudo-aléatoires à renvoyer par Rand (). Ces séquences sont répétables en appelant srand () avec la même valeur de départ.

par exemple.

srand(time(NULL));
1
Macattack

Générer un seul nombre aléatoire dans un programme est problématique. Les générateurs de nombres aléatoires ne sont "aléatoires" que dans le sens où des invocations répétées produisent des nombres à partir d'une distribution de probabilité donnée.

Semer le RNG ne vous aidera pas, surtout si vous le semez à partir d'un minuteur à basse résolution. Vous obtiendrez juste des chiffres qui sont une fonction de hachage du temps, et si vous appelez souvent le programme, ils peuvent ne pas changer souvent. Vous pourriez améliorer un peu en utilisant srand(time(NULL) + getpid()) (_getpid() sous Windows), mais cela ne sera toujours pas aléatoire.

Le SEUL moyen d'obtenir des nombres aléatoires entre multiples invocations d'un programme est de les obtenir de l'extérieur du programme. Cela signifie que vous utilisez un service système tel que /dev/random (Linux) ou CryptGenRandom() (Windows), ou un service tel que random.org.

0
Lee Daniel Crocker
srand(time(NULL));

int nRandonNumber = Rand()%((nMax+1)-nMin) + nMin;
printf("%d\n",nRandonNumber);
0
Byusa

Voici un code source prêt à fonctionner pour le générateur de nombres aléatoires utilisant c tiré de ce site: http://www.random-number.com/random-number-c/ . La mise en œuvre ici est plus générale (une fonction qui obtient 3 paramètres: min, max et nombre de nombres aléatoires à générer)

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

// the random function
void RandomNumberGenerator(const int nMin, const int nMax, const int  nNumOfNumsToGenerate)
{
  int nRandonNumber = 0;
  for (int i = 0; i < nNumOfNumsToGenerate; i++)
  {
    nRandonNumber = Rand()%(nMax-nMin) + nMin;
    printf("%d ", nRandonNumber);
  }
  printf("\n");
}

void main()
{
  srand(time(NULL));
  RandomNumberGenerator(1,70,5);
}
0
dang