簡體   English   中英

如何使用rand函數在特定范圍內生成數字?

[英]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;
}
  1. 你想要整數嗎?
  2. 你想要統一分發嗎?
  3. 您想要將18和35都包含為可能的值嗎?
  4. 你更喜歡用哪種語言?

一般來說,如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM