我想弄清楚一種方法,我可以隨機使用srand和rand生成-1,0或1。每當我做的,但是,我只能夠得到產生的範圍內的值,並從不-1或1隨機添加-1,0或1到C中的數字
這是我的嘗試:
int value;
srand(time(NULL));
value=2*rand()/(RAND_MAX)-1;
然而,在執行時,我總是生成0.我希望能夠偶爾生成-1和1。問題是我必須使用rand和srand作爲規範的一部分。任何幫助將不勝感激,並在此先感謝:)。
我想弄清楚一種方法,我可以隨機使用srand和rand生成-1,0或1。每當我做的,但是,我只能夠得到產生的範圍內的值,並從不-1或1隨機添加-1,0或1到C中的數字
這是我的嘗試:
int value;
srand(time(NULL));
value=2*rand()/(RAND_MAX)-1;
然而,在執行時,我總是生成0.我希望能夠偶爾生成-1和1。問題是我必須使用rand和srand作爲規範的一部分。任何幫助將不勝感激,並在此先感謝:)。
如何
value = (rand() % 3) - 1;
表達rand() % 3
生成0
和2
(含)之間的隨機數,然後減去一個-1
和1
(含)之間得到。
首先,你要3個不同的值,但你只是要求2.第二,在一些實現(和顯然是一個你正在使用)RAND_MAX == INT_MAX,所以你的計算會受到溢出。您可以解決使用浮點
// srand(time(NULL)); Only do this once per invocation of your program
int value = (int)(3.0*rand()/RAND_MAX) - 1;
或long long
int value = 3LL*rand()/RAND_MAX - 1;
或因子移動到除數:
int value = rand()/(RAND_MAX/3) - 1;
編輯:請注意,這些都會產生稍微傾斜(或多或少,因爲RAND_MAX更少或更多)結果,因爲RAND_MAX不是3的倍數。您可以通過以下方式避免這種情況:
int r;
do
{
r = rand();
} while (r >= RAND_MAX/3 * 3);
int value = r/(RAND_MAX/3) - 1;
感謝您的回覆!出於某種原因,您的所有三條建議每次都會產生-1。我不確定這是爲什麼,因爲你的推理對我來說很合理。 – russ0 2013-03-03 21:21:52
@ user2129657他們在這裏工作...... rand()返回什麼值,什麼是RAND_MAX?可能你的實現沒有正確定義RAND_MAX。 – 2013-03-04 00:23:53
@JimBalter,+1試圖平均分配結果並顯示結果。 – 2013-03-04 01:24:34
記得調用'srand(time(NULL));'在你的程序中不要超過一次。特別是不要把它放在一個循環或一個被多次調用的函數中。 – pmg 2013-03-03 20:26:02