Случайные целые числа С++

Я пытаюсь создать случайные целые числа (равномерно распределенные). Я нашел этот фрагмент на другом форуме, но он работает очень странно.

 srand(time(NULL));
    AB=rand() % 10+1;

Используя этот метод, я получаю значения в цикле, поэтому значение увеличивается с каждым вызовом, пока оно снова не уменьшится. Я предполагаю, что это как-то связано с использованием времени в качестве инициализатора? Что-то вроде этого выходит.

 1 3 5 6 9 1 4 5 7 8 1 2 4 6 7.

Однако я хотел бы получить совершенно случайные числа, например

1 9 1 3 8 2 1 7 6 7 5...

Спасибо за любую помощь


person Community    schedule 03.09.2009    source источник


Ответы (4)


Вы должны вызывать srand() только один раз для каждой программы.

person Michał Górny    schedule 03.09.2009

Также ознакомьтесь с библиотекой случайных чисел Boost:

Увеличить библиотеку случайных чисел

person ToastedSoul    schedule 03.09.2009

  • srand() должен выполняться один раз за выполнение, а не один раз для каждого вызова rand(),
  • у некоторых генераторов случайных чисел есть проблема с использованием «младшей цифры», и есть смещение, если вы не отбрасываете какое-то число, возможный обходной путь для обеих проблем:

    int alea(int n){ 
       assert (0 < n && n <= RAND_MAX); 
       int partSize = 
         n == RAND_MAX ? 1 : 1 + (RAND_MAX-n)/(n+1); 
       int maxUsefull = partSize * n + (partSize-1); 
       int draw; 
       do { 
          draw = rand(); 
       } while (draw > maxUsefull); 
       return draw/partSize; 
    }
    
person AProgrammer    schedule 03.09.2009

Вы можете использовать «минимальный стандарт» линейного конгруэнтного генератора Парка-Миллера (LCG): (seed * 16807 mod (2 ^ 31 - 1)). Моя реализация здесь Случайные целые числа с g++ 4.4.5

Функция 'srand()' языка C используется для установки глобальной переменной, которую использует 'rand()'. Когда вам нужна одна последовательность случайных чисел, 'rand()' более чем достаточно, но часто вам нужно несколько генераторов случайных чисел. В таких случаях я бы посоветовал использовать C++ и класс вроде rand31pmc.

Если вы хотите генерировать случайные числа в небольшом диапазоне, вы можете использовать реализацию библиотеки Java, доступную здесь: http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt%28int%29

person Adolfo    schedule 25.03.2015