c++随机数生成器:如何在每次执行时使数字随机

C++ Random number generator: How to make numbers random upon every execution

本文关键字:执行 数字 随机 随机数生成器 c++      更新时间:2023-10-16

我不认为这是一个重复,因为我已经尝试过其他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使randsrand几乎过时了。

下面是一个很好的演示程序:

#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);
    }
}