2009-01-06 6 views
1

J'ai besoin d'un générateur de nombres aléatoires C++ (pseudo, je m'en fou) qui peut me donner des nombres différents chaque fois que j'appelle la fonction. Cela pourrait être simplement la façon dont je l'ai semé, peut-être qu'il y a une meilleure méthode, mais chaque générateur aléatoire que je possède ne génère pas un nouveau nombre chaque fois qu'il est appelé. J'ai besoin d'obtenir plusieurs nombres aléatoires par seconde à l'occasion, et n'importe quel RNG je branche tend à obtenir le même nombre plusieurs fois de suite. Bien sûr, je sais pourquoi, parce qu'il est semé par le second, donc il ne génère qu'un nouveau nombre chaque seconde, mais je dois, d'une façon ou d'une autre, obtenir un nouveau numéro à chaque appel. Est-ce que quelqu'un peut-il me montrer la bonne direction?Un générateur de nombres aléatoires qui peut obtenir des nombres différents en <une seconde

Répondre

17

Sons comme vous le faites comme ceci:

int get_rand() { 
    srand(time(0)); 
    return rand(); 
} 

Ce qui expliquerait pourquoi vous obtenez le même numéro dans la seconde. Mais vous devez le faire comme ceci:

int get_rand() { 
    return rand(); 
} 

Et appeler srand une fois au démarrage du programme.

+1

litb, que ferais-je sans vous! Merci beaucoup, j'ai eu le sentiment que c'était une autre erreur programmée par le programmeur "devrait mieux connaître"! – Cyprus106

7

Vous avez seulement besoin d'ensemencer le générateur une fois avec srand() lorsque vous démarrez, après cela il suffit d'appeler la fonction rand(). Si vous semez le générateur deux fois avec la même graine, vous obtiendrez la même valeur à chaque fois.

4

Vous devez uniquement ensemencer le PRNG une fois.

1

Si vous générez un grand nombre de nombres aléatoires, vous pouvez essayer un générateur XORShift. Pour languit (8 bits):

// initial setup 
unsigned long x = ... init from time etc ... 
// each time we want a random number in 'x': 
x ^= x << 21; 
x ^= x >> 35; 
x ^= x << 4; 
3

Boost.Random a une variété de très bons générateurs de nombres aléatoires.

0

Ce code génère un nombre aléatoire unique une seule fois.

#include <ctime> 
# include <iostream> 
using namespace std; 


int main() 
{ 

     int size=100; 
     int random_once[100]; 
     srand(time(0)); 

     for (int i=0;i<size;i++) // generate unique random number only once 
     { 
      random_once[i]=rand() % size; 
      for(int j=0;j<i;j++) if (random_once[j]==random_once[i]) i--; 
     } 

     for (i=0;i<size;i++) cout<<" "<<random_once[i]<<"\t"; 

    return 0; 
Questions connexes