gpt4 book ai didi

c++ - 随机骰子不重新播种

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:12 25 4
gpt4 key购买 nike

我创建了以下函数来为骰子游戏创建随机数

#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 和 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';
}
}

关于c++ - 随机骰子不重新播种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com