为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
Why does the random number generator not randomize numbers in the void function but does in the main function?
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <ctime>
using namespace std;
void coinToss();
int main()
{
cout << "How many times do you want to flip the coin?n";
int choice;
cin >> choice;
for (int i = 1 ; i <= choice; i++)
{
cout << "Rolling Dice # " << i << endl;
coinToss();
}
return 0;
}
void coinToss()
{
unsigned seed = time(0);
srand(seed);
int result;
result = (rand() % (2 - 1 + 1)) + 1;
if (result == 2)
cout << "Tailsn";
else
cout << "Headsn";
cout << endl;
}
当我这样做时,它不会随机化数字,只是一遍又一遍地给出相同的数字。但如果我把";unsigned see=时间(0(;srand(种子("在我的主函数中,它实际上是随机化的,并给出不同的数字?
通常使用线性反馈随机数生成器,使用种子初始化随机化器一次,然后使用同一种子多次调用rand((。对rand((的每次调用都将被保存,并在对rand的NEXT调用中使用-因此,自混合会创建";随机查找";数字-IE一个伪随机数生成器(PRNG(
|--------|
| Seed | Set Once
|________|
|
|--------| v
| Rand() |---- Mix with seed or last rand()
|________| |
^ v
| |--------|
-----| Rand() |
|________|
如前所述,您正在为随机化器重新设置种子(重置它(,然后调用rand((EACH coinToss((。这将不允许rand((与之前对rand(,当您重置它时(的调用混合,因此不会产生随机数。你还必须意识到这是PESUDO随机数,即不是真正的随机性,只是看起来随机。。因此,代码可能会做各种不可靠的事情来产生这些看起来像伪随机的数字。
如果您使用的是c++11或更新版本,请考虑使用#include/mt19937随机数生成器,它比rand((/srand(
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1.0, 10.0);
for (int i=0; i<16; ++i)
std::cout << dist(mt) << "n";
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 声明默认的模板化函数
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- RcppEigen 模板化函数,用于填充单位法线
- 特征模板化函数和维度
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 跨模板化函数编译的静态变量
- Gecode 与 Z3 用于约束随机化
- 如何使用兰德随机化模拟点击
- 推断模板化函数中的函数重载
- 模板化函数或具有指向基类的指针的函数
- 何时需要实例化函数模板定义?
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 如何使用模板化类专门化模板化函数?
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- clang:使用 O3 导出隐式实例化函数的符号
- 从模板化函数调用非模板化函数
- 随机数函数未正确随机化 (C++)
- 在 C++ 的矢量 resize() 函数中随机化构造函数参数