[英]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.