[英]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 17462938647148434322 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使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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.