我想通過標準化要求的範圍內開始(後只需添加min
的隨機GE nerated數):
int max_rnd = max - min;
然後在範圍1
生成均勻分佈的隨機數來pow(2, max_rnd+1) - 1
int rnd_limit = (1 << (max_rnd + 1)) - 1;
int rnd = (rand() % rnd_limit) + 1;
回合向下所產生的隨機數的基數爲2的對數。的rnd
翻譯將遵循這個模式:
floor(log2(1)) -> 0
floor(log2(2)) -> 1
floor(log2(3)) -> 1
floor(log2(4)) -> 2
...
floor(log2(7)) -> 2
floor(log2(8)) -> 3
...
floor(log2(15)) -> 3
...
所以結果的分佈將是期望的相反(雙,而不是一半更高的數字),但多數民衆贊成容易改變。實際上,在floor(log2(rnd))
被計算在rnd
最高的1位的位置,所以它可以與位位移循環來實現:
int log2_rnd = 0;
while ((rnd >> log2_rnd) != 1)
{
++log2_rnd;
}
時間的實際結果是:
return (max_rnd - log2_rnd) + min;
這裏不討論:由rand()
(特別結合模數)生成的「均等分佈」數字的精確度和生成數字的上限。
你到目前爲止嘗試過什麼? – rsp
[生成隨機數的指數分佈]可能的重複(https://stackoverflow.com/questions/34558230/generating-random-numbers-of-exponential-distribution) – Lanting
int getValue(int min,int max){ int I = 0; while(i == 0) i = rand()%max; int j = 0; (j == 0) { printf(「%d」,j); j = rand()%i; } return j; } –