c++随机数生成器:如何在每次执行时使数字随机
C++ Random number generator: How to make numbers random upon every execution
我不认为这是一个重复,因为我已经尝试过其他SO的答案,他们不适合我。当我运行一个程序(以时间为种子)时,我得到一堆随机数。几秒钟后,我再次运行程序,得到一堆类似的随机数。
srand(time(0));
for(int i=0; i<10; i++) {
cout<<rand()<<"n";
}
86035531462625114799167992823031436029504
863919984304428803299552722529699882213897411
正如你所看到的,数字是不同的,但实际上是相似的。这对我不起作用的原因是因为我将其转换为0到1之间的浮点数(除以RAND_MAX)。当我这样做的时候,以秒为单位的时间过得非常慢。一次是0.09245...
,然后是0.0925...
。我使用这些概率来制作21点AI,我不希望在随后的执行中出现相同的下注模式。
我已经看了很多,并试图将种子放入循环中,但这只是打印相同的数字10次。不确定如何使数字从执行时间开始看起来完全随机。谢谢你的建议
编辑:使用 srand(rd());
for(int i=0; i<10; i++) {
cout<<generate()<<"n";
}
14514284786278117030462054674016764290813109570281517897720174629386471484343223554882785677395967469126240319926998463599546848164252941897054265919987896041709892525165566358044926049913402
我认为我每次运行它都会得到完全相同的序列。
编辑2:一点背景知识来澄清困惑。我希望分配是平均的,但如果不是也没关系,这只是我自己的做法,不是赌场生意。我最初的计划是有6个字符有一个值12-20的命中/停留概率数组。所以Jim可能会编造这些数字[0.958367,0.942123,0.876655,0.864322,0.7543321,0.653213,0.201201,0.12919,0.00001]。假设吉姆的手牌是14。所以我得到一个随机的0-1数字,如果它小于0.876655,那么他就会命中。经过100轮筛选的优胜者将混合他们的"基因",也许经过1000轮筛选后,完美的孩子将自然地被选中,完美的命中/通过比率将形成。这就是为什么我注意到Pam或其他人总是会击中:他们的随机组总是在0.05左右下降,所以无论她的手有多好或多坏,她都会击中。我几乎完成了,唯一的事情是修复这个随机生成器和另一个小错误处理下注钱(无关我保证)
如果可能的话,使用std::random_device
获得您的种子,使用std::mt19937_64
生成您的数字。std::random_device
打算(但不幸的是,不能保证)使用硬件来生成真正的随机数,所以至少在一个好的实现中,它确实是相当随机的(但带宽相当低)。
c++ 11使rand
和srand
几乎过时了。
下面是一个很好的演示程序:
#include <random>
#include <iostream>
int main() {
std::mt19937_64 gen{ std::random_device()() };
std::uniform_real_distribution<double> dis{ 0.0, 1.0 };
for (int i=0; i<10; i++)
std::cout << dis(gen) << "n";
}
至少对于一个合理的库实现,这应该产生相当可靠的结果。
这里有一个我认为你想要它做的例子:
//I'm guessing your time(0) was intended to be this?
static DWORD dwTime = timeGetTime();//static = value doesn't change
srand(dwTime);
while (1) //while the app is running, perform these actions.
{
DWORD dwCurrTime = timeGetTime();
for (int i = 0; i < 10; i++) {
cout << rand() % 10 + 1 << "n"; //1-10
//if dwTime + 500 milliseconds is less than current timeGetTime()
//sleep, this allows you to check the code easily for repeats
if (dwTime + 500 < dwCurrTime)
Sleep(10000);
}
}
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++,系统无法执行指定的程序
- 检查输入是否不是整数或数字
- 使用C++中的模板和运算符重载执行矩阵运算
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何用数字处理log(0)
- 如何通过使用 2 位或更多数字的 XOR 运算符来执行此操作C++问题
- 如何执行此程序,将键入的数字显示为数字值的多次
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 如何在包含数字的.bmp(二进制图像)中执行组件标记9 4 3 6
- 程序编译并执行,但输出的不合理大的数字作为最大值.如何显示长双倍?
- C++:如何对文本文件中的每个数字执行操作
- 为什么我的 c++ 计算器每减去我输入的两个数字,而不是执行我要求它执行的操作
- C++函数,它接受多个数字并执行不同的任务
- c++随机数生成器:如何在每次执行时使数字随机
- 如果条件计算字符串中的 "1" 位数字未执行
- 是否可以将数组数字作为函数来执行?