簡體   English   中英

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";
}

8603 55 3146 26251 14799 16799 28230 314 3602 9504

8639 19984 3044 28803 29955 27225 29699 882 21389 7411

如您所見,數字是不同的,但實際上是相似的。 這對我不起作用的原因是因為我將其轉換為0到1之間的浮點數(除以RAND_MAX)。 當我這樣做時,以秒為單位的時間非常緩慢。 在一次運行中,我可以有0.09245... ,然后我可以有0.0925... 我正在使用這些概率制作二十一點AI,並且我不希望在隨后的執行中出現相同的下注方式。

我到處找了很多,並試圖將種子放入循環中,但是只打印了10次相同的數字。 不確定如何使數字從執行時間開始就完全隨機出現。 謝謝你的想法

編輯:

使用

    srand(rd());    
    for(int i=0; i<10; i++) {   
        cout<<generate()<<"\n";
    }

14514284786278117030 4620546740167642908 13109570281517897720 1746293864714​​8434322 355488278567739596 7469126240319926998 4635995468481642529 418970542659199878 9604170989252516556 6358044926049913402

我每次運行都會得到完全相同的序列。

編輯2:

一點點背景可以消除混亂。 我希望分配是均勻的,但是如果不是,那是可以的,這只是我自己的做法,沒有賭場業務。 我原來的計划是有6個字符,其命中/停留概率數組的值是12-20。 因此,就像吉姆(Jim)會[0.958367、0.942123、0.876655、0.864322、0.7554321、0.653213、0.201201、0.12919、0.00001]設定這些數字一樣。 假設Jim的牌為14。所以我得到一個隨機的0-1數字,如果它小於0.876655,那么他會命中。 優勝者經過100回合后,其“基因”會混合在一起,也許經過1000次循環后,自然會選擇完美的孩子,並形成完美的命中率。 這就是我注意到Pam或某人總是會命中的原因:他們的隨機gen總是下降到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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM