2014-06-10 71 views
0

我想生成一個0的隨機流& 1(10000次迭代)約束條件下1應該只發生在400次迭代中的任何一次。可以幫助我的人用它的C代碼以及在C中使用的庫和函數。若要生成具有一定約束的隨機位模式

+0

我已經添加了隨機標籤。可能有比我更好的方法,可以爲這種不對稱的伯努利分佈提供更好的統計特性。 – Bathsheba

+0

你想'0'發生的次數是'1'的399倍嗎?或者你想'0'的概率是獲得'1'的概率的399倍? – bitmask

回答

1

400.0 * rand()/(RAND_MAX + 1.0) < 1 ? 1 : 0是一種方式。

如果您感到自信並且表達式與左值類型匹配,則刪除三元組。請注意仔細安置400.01.0

重要提示:如果你在400的概率需要一種精確的1不接受這個解決方案該解決方案將無法正常工作,如果RAND_MAX是400一個「非常差多個」鑑於該標準規定RAND_MAX不低於32767,在這個低值下,這種技術的統計特性將會很差。)

+0

['rand()'認爲有害](http://www.youtube.com/watch?v=LDPMpc-ENqY)也解釋了爲什麼此解決方案存在問題。 – bitmask

1

這裏有一個解決方案,它提前選擇一個間隔爲400的點擊並在它出現時報告它;否則它會發出0.當報告結果時,下一個時間間隔的命中由rand()確定。該functon保持其狀態static變量,並使用特殊值-1初始化本身:

int pick(int n) 
{ 
    return 400 * rand()/((double) RAND_MAX + 1); 
} 

int next() 
{ 
    static int hit = -1; 
    static int count; 

    if (hit < 0) hit = pick(WIDTH); 
    if (count++ == hit) { 
     hit = ((hit/WIDTH) + 1) * WIDTH + pick(WIDTH); 
     return 1; 
    } 

    return 0; 
} 

你這樣稱呼它:

for (i = 0; i < 10000; i++) { 
    printf("%8d %d\n", i, next()); 
} 

這是拔示巴的解決方案不同,因爲它保證瞭如果您的示例是400的倍數,則分配1:399。這意味着它可能不是您要查找的內容。

編輯我介紹了一個新的功能pick,其拍攝之間的隨機數0(includive)和n(獨家),它希望提供比模功能的更好的分配。

+0

No. No.蘭特()%N是這個世界上這麼多問題的原因!如果發生器的週期不是N的倍數,它會引入一個統計偏差。 – Bathsheba

+0

您的意思是飢餓,戰爭,恐怖主義? –

+1

;-)雖然我不想在導彈制導系統中的任何地方看到「rand()%'。 – Bathsheba