Случайная игра в кости не пересевает

Я создал следующую функцию для создания случайных чисел для игры в кости

#include <iostream>
#include <ctime>
#include <cstdlib>
#include "dice.h"#include "display.h"using namespace std;
int die[6][10];
void dice(int times, int dice){
int r;
for(int x=0;x<times;x++){
for(int x=0;x<dice;x++){
srand(time(0));
r=(rand() % 5);
die[r][x]+=1;
cout<<"Die #"<<x+1<<" rolled a "<<r<<endl;
}
}

}

Это не повторно, хотя. Он просто выводит одинаковое число для каждого кубика. Кто-нибудь знает, как я мог это исправить?

2

Решение

srand () в функции, которая вызывается повторно, или цикл не годится.

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

1

Другие решения

Вы не правильно используете функции srand и rand. Предполагается, что вы «запустили» генератор случайных чисел один раз, а затем использовали rand() извлекать последовательные значения из RNG. Каждое начальное число приводит к определенной последовательности чисел, которая соответствует определенным критериям случайности.

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

Даже если значение возвращается time() обновляется достаточно быстро, чтобы вы каждый раз получали новое начальное число, и вам все равно не будут гарантированы хорошие случайные числа. Генератор случайных чисел предназначен для создания последовательности чисел, в которой эта последовательность имеет определенные статистические свойства. Однако нет гарантии, что одни и те же свойства сохраняются над значениями, выбранными из разные последовательности.

Таким образом, чтобы использовать детерминированный генератор случайных чисел, вы должны заполнить генератор только один раз, а затем использовать последовательность значений, полученных этим одним начальным числом.


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

В C ++ вы должны предпочесть <random> библиотека, которая обеспечивает гораздо лучшие функции. Вот пример использования <random>,

#include <random>
#include <iostream>

int main() {
const int sides = 6;
int groups = 10, dice_per_group = 3;

std::uniform_int_distribution<> distribution(1,sides); // create an object that uses randomness from an external source (provided later) to produces random values in the given (inclusive) range

// create and seed the source of randomness
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);

for (int i=0; i<groups; ++i) {
for (int j=0; j<dice_per_group; ++j) {
// use the distribution with the source of randomness
int r = distribution(engine);
std::cout << "Die #" << j+1 << " rolled a " << r << '\n';
}
std::cout << '\n';
}
}
3

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

В приведенном выше случае вы хотите вывести srand () из цикла.

1

Вы хотите вызвать srand () только один раз. Так мало времени проходит, что time () возвращает одно и то же значение. Таким образом, генератор случайных чисел запускается в том же месте.

Вызовите srand перед функцией, если это возможно, или ее начало.

0
По вопросам рекламы [email protected]