Ограничивает ли использование модуля с rand() результаты?

#c #random #modulus

#c #Случайный #модуль #c

Вопрос:

Это программа, созданная для игры, в которой я использую rand() , чтобы попытаться случайным образом сгенерировать, какие типы деревьев можно найти в поселении. Начальное значение для rand() было установлено на время в main.cpp так что каждый раз он уникален. Однако мой вопрос здесь касается моего модуля: trees[x]=rand()@;

Если я правильно понимаю, как rand() работает, как только он выводит число, которое он уже вывел, он будет повторять ту же последовательность чисел, которая у него уже есть, потому что он использует формулу. Ограничивает ли использование модуля мою программу созданием только 40 различных последовательностей случайных чисел? Или он продолжает извлекать новое случайное число для каждого из следующих массивов из системных часов?

 #include <stdafx.h>
#include <iostream>
#include <cstdlib> // for rand() and srand()
#include <ctime> // for time()
using namespace std;

int forestdeterminator()
{
int trees[32];
for (int x=0; x<32;   x)
    trees[x]=rand()%40;

    if (trees[0]>=1 amp;amp; trees[0]<=9)
        cout << "Birch Trees" << endl;
    if (trees[1]>=1 amp;amp; trees[1]<=3)
        cout << "Mahogany Trees" << endl;
    if (trees[2]>=1 amp;amp; trees[2]<=20)
        cout << "Oak Trees" << endl;
    if (trees[3]>=1 amp;amp; trees[3]<=4)
        cout << "Cherry Trees" << endl;
    if (trees[4]==1)
        cout << "Tigerwood Trees" << endl;
    if (trees[5]==1)
        cout << "Swampwood Trees (Swamp Only)" << endl;
    if (trees[6]>=1 amp;amp; trees[6]<=8)
        cout << "Yew Trees" << endl;
    if (trees[7]==1)
        cout << "Petrified Trees" << endl;
    if (trees[8]>=1 amp;amp; trees[8]<=24)
        cout << "Pine Trees" << endl;
    if etc etc...
  

Комментарии:

1. rand() обычно это не очень хороший PRNG, а модульная арифметика для ограничения диапазона ухудшает ситуацию. Вам действительно следует использовать возможности C 11 или Boost random number.

Ответ №1:

Нет. Вы используете только результат rand() функции, поэтому это абсолютно не влияет на выходные данные PRNG. Только если вы использовали rand()@ для последовательного заполнения PRNG, вы столкнулись бы с этим ограничением.

Также обратите внимание, что PRNG обычно заполняется из системных часов только один раз, при его инициализации. С этого момента каждое число «зависит» от ранее выведенного.

Наконец, имейте в виду, что использование модуля на выходе PRNG почти во всех случаях приведет к искажению результирующего распределения вероятностей. Этот эффект очень очень мал для небольшого модуля, но может быть важным для рассмотрения, в зависимости от вашего приложения.

Комментарии:

1. @jacisback Если вы считаете, что на ваш вопрос получен ответ, пожалуйста, поставьте галочку рядом с ответом, который вы хотите принять

2. @goncalopp: Я думаю, вы могли иметь в виду «искажать», а не «избегать»?

Ответ №2:

Ограничивает ли использование модуля мою программу созданием только 40 различных последовательностей случайных чисел?

Последовательности, спорные. Числа. Определенно. Вы не можете получить эффективную случайность только с 40 возможными выходами; там просто недостаточно свободы для колебаний. Но нет, вы не влияете на выводимые числа, вы просто сильно ограничиваете то, каким будет результат вашей программы.

Ответ №3:

что вы делаете, так это помещаете 32 (псевдо) случайно сгенерированных целых числа в диапазоне от 0 до 39 в массив, называемый деревьями. выполнение этого не влияет на то, как работает функция rand(). он будет продолжать генерировать числа из полной области, независимо от того, какие операции вы применяете к его предыдущим результатам.

итак, если я вас правильно понял, ответ таков: нет, использование rand()@ где-нибудь в вашем коде волшебным образом не заставит функцию rand () генерировать только числа из диапазона 0-39.