[英]How to use the rand function to make numbers in a specific range?
我想在特定范圍內制作隨機數,例如“選擇18到35之間的隨機數”? 我怎么能用rand()
函數做到這一點?
根據您使用的語言,內置隨機數生成器可能已具備此功能 - 進行更多研究。
假設您隨機數生成器始終返回某個給定范圍內的數字。 僅僅為了爭論,我們可以說范圍是0..65536,但是你想要在你的例子中Low..High,18..35范圍內的隨機數。
做錯的方法是這樣的:
r = (rand() % (High - Low + 1)) + Low
rand()返回0..65536范圍內的數字。 除以(高 - 低+ 1)后的余數,在本例中為(35 - 18 + 1 = 18)。 結果是0..17之間的數字。 為此你添加低(18),將結果r移動到18..35的范圍內。 您正在尋找的范圍。
在用於獲得余數的除數不是rand()函數返回的上限的偶數倍的情況下,以這種方式生成的數字不具有均勻分布。 請參閱Fischer Yates算法 - 模數偏差 。 要消除此偏差,您需要計算小於rand()返回的最大數字,但均勻地除以(High - Low + 1)。 在你的情況下是3640 * 18 = 65520.使用它作為rand()返回的數字的高范圍過濾器,如下所示:
do forever {
r = rand()
if r <= 65520 then {
r = (r % (High - Low + 1)) + Low
break
}
}
現在,您生成的隨機數應具有與rand()相同的分布特征。
如果這是用C語言編寫的,那么你就非常接近了。 編譯此代碼:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
for (i = 0; i < 1000000; i++) {
printf("%d\n", rand()%(35-18+1)+18);
}
}
在管道中運行它會產生以下輸出:
chris@zack:~$ gcc -o test test.c
chris@zack:~$ ./test | sort | uniq -c
55470 18
55334 19
55663 20
55463 21
55818 22
55564 23
55322 24
55886 25
55947 26
55554 27
55342 28
55526 29
55719 30
55435 31
55669 32
55818 33
55205 34
55265 35
關鍵是你忘了添加1 - fencepost錯誤 。
您可以將其概括為一個函數:
int random_between(int min, int max) {
return rand() % (max - min + 1) + min;
}
一般來說,如果rand()在[0.0 ... 1.0)中返回一個浮點值(也就是說,你可能會得到任意接近1.0但實際上不是1的值)那么你會想要類似的東西
hi = 36
lo = 18
res = int( (hi-lo)*rand() + lo ) # returns random values in 18..35
請注意,這實際上永遠不會返回hi值 - 因此我將其增加1(即,您將獲得18到35之間的所有值,但從不36)。
希望有所幫助。
假設rand()給出一個0到1.0之間的數字
然后使用rand()*(35 - 18)+ 18來獲得18到35之間的隨機數。
編輯:你不需要mod。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.