2014-04-17 227 views
-1

如何生成1和3之間的隨機數? 有了這個功能,我得到有時0(我只希望有1,2或3):1和3之間的隨機數

ziehen=rand() % 3 + 1; 

爲什麼我要在主程序中添加函數srand(0)? 我已添加

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

到Libaries。這是足夠的還是我需要更多?

+3

_'or我需要更多?'_是否行得通? –

+0

啊,好老的剩餘技術。請閱讀http://ericlippert.com/2013/12/16/how-much-bias-is-introduced-by-the-remainder-technique/ – harold

+0

獲取rand()的結果副本,並將其用於計算ziehen。當ziehen爲零時打印它的值。看看哪些數值會讓你零。 – cup

回答

1

該代碼永遠不會返回0. rand()總是返回一個介於0和RAND_MAX之間的數字。

模操作返回一個介於0和2之間的值。加1會得到你想要的結果。 不需要括號。模數等於上述加數。

你不必添加srand(0),但是如果你這樣做,你總會得到相同的數字序列。閱讀文檔。

+0

從技術上講,你稱之爲「模運算」被稱爲「餘數」。它返回-2和2之間的值(提示)。 –

+1

但是我們只有0和RAND_MAX之間的值。這怎麼可能是消極的? – xMRi

+0

是的,我想知道OP如何管理它(並且OP說包含了stdlib.h,它應該提供'rand()'的原型 - 缺少原型是我想到的方法之一) –

2

您必須從不使用模數來減少輸出的週期性rand()。原因?這是因爲標準線性同餘發生器的低位比較高位比較不隨機:模數丟棄高位。

最好的辦法是使用(3.0 * rand()/(RAND_MAX + 1.0)) + 1.0;。通過將輸出分配給整型,隱式將其轉換爲int

RAND_MAX由C標準定義,它的值是依賴於實現

+0

嗯,這將返回'[0; 3]'? –

+0

是的,當隱式轉換爲'(int)'時,它將返回1,2或3.我已經修改了一些更多的細節。 – Bathsheba

+2

可能會好一點,並且經常作爲解決方案給出,但它也不正確,請參閱http://www.azillionmonkeys.com/qed/random.html – harold