Я создал следующую функцию для создания случайных чисел для игры в кости
#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;
}
}
}
Это не повторно, хотя. Он просто выводит одинаковое число для каждого кубика. Кто-нибудь знает, как я мог это исправить?
srand () в функции, которая вызывается повторно, или цикл не годится.
Поместите ваш вызов srand () в main. Вызывайте это только один раз для каждой программы.
Вы не правильно используете функции 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';
}
}
Вы хотите вызывать srand () только один раз для любой симуляции, которую вы делаете. Причина этого в том, что при каждом вызове вы перезапускаете rand (), что налагает смещение на значения rand (). Это особенно важно, если вы принимаете i.i.d.
В приведенном выше случае вы хотите вывести srand () из цикла.
Вы хотите вызвать srand () только один раз. Так мало времени проходит, что time () возвращает одно и то же значение. Таким образом, генератор случайных чисел запускается в том же месте.
Вызовите srand перед функцией, если это возможно, или ее начало.