2010-10-06 53 views
0

可能顯示的文件:
Generate Random numbers uniformly over entire range
In C, how do I get a specific range of numbers from rand()?如何隨機地用C打印1〜10

我要生成在C.它有蘭特()的隨機數和函數srand( )函數stdlib.h但它給了我非常大的數字。但我只想要數字b/w 1到10.所以,這是可能的,如果是的話,那麼如何?如果可以隨機生成a-z的字符。

+1

'蘭特()%10 + 1'但注意偏差 – pmg 2010-10-06 20:37:29

+2

很多重複在SO上。例如http://stackoverflow.com/questions/288739/generate-random-numbers-uniformly-over-entire-range,http://stackoverflow.com/questions/1202687/in-c-how-do-i-get-一個特定範圍的數字從蘭特 – 2010-10-06 20:38:12

+0

投票關閉... [插入你最喜歡的堆棧溢出C蘭特()問題在這裏] – Timothy 2010-10-06 20:58:23

回答

7

最簡單的方法是使用模運算符將結果截斷到您想要的範圍。做rand() % 10會給你一個從0到9的數字,如果你給它加1,即1 + (rand() % 10),你會得到一個從1到10(包括1)的數字。

而在別人抱怨之前,這可能會稀釋隨機分佈,不過,它應該爲簡單目的而正常工作。

+0

重複也不要忘記播種隨機數發生器或你'在某些系統上每次都會得到相同的序列。 – 2010-10-06 20:40:18

+0

OP已經提到'srand',所以我假設他知道它。 – casablanca 2010-10-06 20:41:17

+0

模運算符根據最低有效位給出答案,在一些RNG中,最不重要的位數比隨機數少。我寧願與分裂。 – 2010-10-06 21:07:16

1

Modulo(%)有一些偏差。

略優選的是按比例的隨機數:

int aDigit = (int) (((double)rand()/(RAND_MAX+1)) * 9 + 1); 
printf("%d", aDigit); 

其分解:

((double)rand()/RAND_MAX) 

將產生在0.0和0.99999

* 10 

之間的雙匝,爲一個數字爲0.0至9.9999。

+ 1; 

原來是爲1.0 - 10.999

(int) 

原來是到1-10,這是你問什麼。

+0

這種方法也有偏見。參見:http://stackoverflow.com/questions/3746814/create-a-random-number-less-than-a-max-given-value/3746930#3746930 – jamesdlin 2010-10-07 02:19:19