簡體   English   中英

蘭德生成相同的數字

[英]Rand generating same numbers

我制作的小型游戲有問題。

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int span = 100;
srand(time(0));
int TheNumber = static_cast<double> (rand()) /RAND_MAX * (span -1) +1;
cout << "You need to guess the number between 1 and " << span << endl;
int mynumber;
int numberofAttempts = 0;

do {
    cout << ++numberofAttempts <<" Attempt: ";
    cin >> mynumber;
    if (mynumber > TheNumber)
        cout <<"Lower!" << endl;
    else if (mynumber < TheNumber)
        cout <<"Higher!" << endl;
} while (mynumber != TheNumber);

cout << "SUCESS!!!" << endl;
return 0;
}

該游戲應該生成一個0-100之間的隨機數,您應該猜出來。 運行此代碼15-20次后,相同的數字甚至生成了8次(在我的情況下為2)。

我知道沒有絕對隨機數,它使用一些數學公式或某種方法來求一個,我知道使用srand(time(0))使其取決於當前時間。 但是,由於我不希望上面提到的事情發生,我將如何使其“更加”隨機。

我第一次運行它的結果是11,再次運行(猜測正確的數字后),即使時間改變了,它仍然是11。

[ADDITION1]

如果您確實希望研究更好的隨機數生成,那么這是一個很好的算法,首先:

http://en.wikipedia.org/wiki/Mersenne_twister

請記住,盡管任何“計算機生成的”(即數學生成的)隨機數都是偽隨機的。 偽隨機意味着,盡管算法的輸出看起來具有正態分布,但如果人們知道輸入種子,則它們是真正確定的。 真正的隨機數是完全不確定的。

[原始]請嘗試以下任一行:

rand() % (span + 1);  // This will give 0 - 100
rand() % span;        // this will give 0 - 99
rand() % span + 1;    // This will give 1 - 100

代替:

(rand()) /RAND_MAX * (span -1) +1

另外,不要將結果轉換為雙精度,然后放入int中。

也看這里:

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

在回應評論!!! 如果您使用:

rand() / (span + 1);

那么為了獲得0到100之間的值,那么rand的輸出值確實必須在0到(100 * 100)之間,並且必須保證這種性質。 這是因為簡單的划分。 當rand()產生101-201時,值1將會彈出,當rand()輸出202-302的值時,值2將彈出除法。

在這種情況下,您可以在100 * 100僅10000的情況下使用它,並且在32位空間中肯定有比該整數大的整數,但是通常做除法運算將不允許您利用提供完整的數字空間!!!

rand()有很多問題。 您遇到了其中一個,即前幾個值不是“隨機”的。 如果必須使用rand() ,則最好丟棄rand()的前四個或結果。

srand (time(0));
rand();
rand();
rand();
rand();

rand()另一個問題是,即使經過上述修改,低階位也眾所周知是非隨機的。 在某些系統上,最低位交替0,1,0,1,0,1,...。使用高位位總是更好,例如使用商而不是余數。

其他問題:非隨機性( rand()大多數實現未能通過許多隨機性測試)和周期短。 對於所有這些問題,最好的建議是使用rand()任何東西。

首先, rand() / RAND_MAX不給出0到1之間的數字,它返回0。這是因為RAND_MAX在rand()的結果中適合0倍。 兩者都是整數,因此使用整數除法不會返回浮點數。

其次,RAND_MAX的大小可能與INT相同。 然后將RAND_MAX與任何值相乘將產生溢出。

暫無
暫無

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

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