簡體   English   中英

隨機數生成器機制

[英]Random Number Generator mechanism

我的書中存在以下問題:

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
    clrscr();
    randomize();
    int Game[]={10,16},P;
    int Turn=random(2)+5;
    for(int T=0;T<20;T++)
       {
           P=random(2);
           cout<<Game[P]+Turn<<"#";
       }
getch();
}

輸出像16#22#16#16#16#22#.... 20次...為什么輸出總是16#或22#? 為什么不使用15#或21#? 我想這個程序的機制。 謝謝。 turn = random(2)+5; 如果random(2)給出0,則轉彎變為轉彎= 0 + 5 = 5,這意味着我應該得到10 + 5 = 15和16 + 5 = 21以及16和22,但我沒有得到它們。

我們在計算機科學理論考試中遇到了上述問題,我們選擇了正確的答案(即它生成16和22),但是我將如何知道它只會生成16和22。 21也可能。

也許這會有所幫助:

未設置隨機數生成器的種子。

如果調用srand(time(NULL)),則將獲得更多隨機結果

C ++ rand()在運行進程時給出相同的數字

您需要提供一個seed值,以幫助獲得“真正的”隨機性。 成員

計算機本身無法將數字隨機化,而是為此使用了種子。

但是種子並不是完全隨機的,它們只有特定的順序,例如:

1
2
8
5
4

這些數字看起來很隨機,但是下次運行該程序時,您會得到:

1
2
8
5
4

完全一樣。

為避免這種情況,我們將時間用作種子,時間總是在變化,因此它將始終生成新的數字。

#include <time.h>
srand(time(NULL));  // srand is the function to randomize numbers from a seed, we use 'time' as seed here

這個視頻解釋了它。

因為Turn僅被隨機化一次-在循環的開始。 如果將Turn的分配移到循環中,則還應該得到1521

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
    clrscr();
    randomize();
    int Game[]={10,16},P;
    int Turn;
    for(int T=0;T<20;T++)
       {
           P=random(2);
           Turn=random(2)+5;
           cout<<Game[P]+Turn<<"#";
       }
    getch();
}

同樣,正如其他人所說,如果您希望輸出在兩次運行之間有所不同,則需要為隨機數生成器提供種子,例如,通過使用seed調用srand() 例如:

#include <time.h>
(...)
srand(time(NULL));

暫無
暫無

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

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