Генератор случайных чисел, который может получить разные числа за <секунду - PullRequest
1 голос
/ 07 января 2009

Мне нужен генератор случайных чисел C ++ (псевдо, мне все равно), который может получать разные числа при каждом вызове функции. Это может быть просто способ, которым я его заполняю, может быть, есть лучший метод, но каждый случайный генератор, который у меня есть, не генерирует новое число при каждом вызове. Мне иногда нужно получать несколько случайных чисел в секунду, и любой ГСЧ, который я подключаю, имеет тенденцию получать одно и то же число несколько раз подряд. Конечно, я знаю почему, потому что он засевается вторым, поэтому он генерирует новый номер каждую секунду, но мне нужно каким-то образом получать новый номер при каждом вызове. Может кто-то указать мне верное направление?

Ответы [ 6 ]

17 голосов
/ 07 января 2009

Похоже, вы делаете это так:

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

Что объясняет, почему вы получаете одно и то же число в течение одной секунды. Но вы должны сделать это так:

int get_rand() {
    return rand();
}

И вызовите srand один раз при запуске программы.

7 голосов
/ 07 января 2009

Вам нужно только запустить генератор один раз с srand() при запуске, после этого просто вызовите функцию rand(). Если вы дважды запустите генератор с одним и тем же начальным значением, вы каждый раз будете возвращать одно и то же значение.

4 голосов
/ 07 января 2009

Вы должны сеять PRNG только один раз .

3 голосов
/ 07 января 2009

Boost.Random имеет множество неплохих генераторов случайных чисел.

1 голос
/ 07 января 2009

Если вы генерируете большое количество случайных чисел, вы можете попробовать генератор XORShift. Для длинных (8 бит):

// 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;
0 голосов
/ 20 декабря 2011

Этот код генерирует уникальное случайное число только один раз.

#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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...