2017-05-29 31 views
0

我想生成一個隨機數,其中每個較高數字的前一個概率的一半,即1出現的次數是4次2應該出現2次並且應該出現3次一個時間等 編程語言必須使用Cc程序中的概率隨機數實現鎖定免費跳過列表實現

int getValue(int min,int max) { 
    int i=0; 
    while(i==0) 
     i=rand()%max; 
    int j=0; 
    while(j==0) { 
     printf("%d",j); 
     j=rand()%i; 
    } 
    return j; 
} 
+0

你到目前爲止嘗試過什麼? – rsp

+1

[生成隨機數的指數分佈]可能的重複(https://stackoverflow.com/questions/34558230/generating-random-numbers-of-exponential-distribution) – Lanting

+0

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; } –

回答

1

以下功能可用於:

int prioritizdRand(int min, int max) 
{ 

    int result=min; 
    int randNum=rand(); 
    long int start=RAND_MAX/2; 

    while(randNum > start) 
    { 
     if(result> max) 
     { 
      return min; 
     } 
     result++; 
     start= (start + RAND_MAX)/2; 
    } 

    return result; 
} 
+0

對我來說錯了......讓我們假設'prioritizdRand(1,2)',那麼它很可能會在'randNum>開始'條件之前碰到'result grek40

+0

可能是真的,但爲了確保終止而犧牲正確性是一項非常艱難的交易。對涉及的數字稍作調整可能會達到終止目標。部分問題是,你從隨機數字空間中分配一部分'1/pow(2,max-min)'到無效的結果。 – grek40

+0

這個部分的指數可能會偏離1,但正如已經評論的那樣,如果你只是分析'prioritizdRand(1,2)'非常清楚:'1/2'爲'result = 1','1/4 'for result = 2','1/4'剩下,由於result grek40

1

我想通過標準化要求的範圍內開始(後只需添加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()(特別結合模數)生成的「均等分佈」數字的精確度和生成數字的上限。

1

一個簡單的想法:用價值一個開始,採取隨機數,添加一個 值,如果隨機數是奇數,位位移一個正確,重複

unsigned randhalf() 
{ 
    unsigned ret = 1; 
    int rnd = rand(); 
    while (rnd&1) 
    { 
     ++ret; 
     rnd >>= 1; 
    } 
    return ret; 
} 

或者如果需要的上限和下限:

int randhalf(int min, int max) // bounds are inclusive 
{ 
    int ret = min; 
    int rnd = rand(); 
    while (rnd&1 && ret<max) 
    { 
     ++ret; 
     rnd >>= 1; 
    } 
    return ret; 
} 

這將只提供由然而,許多位 rand()用途比min較大的值。

+0

非常優雅(+1),但「min,max」值呢? – grek40