1樓:
把區間[a,b]上的點r線性對映到區間[x,y],用公式
(b-r)*(y-x)/(b-a)+x即可。
c語言裡面a=0,b=RAND_MAX,有的語言a=0,b=1。
2樓:Milo Yip
通常是這樣寫:
#include
/* srand(), rand(), RAND_MAX */#include
/* printf() */
#include
/* time() */
intmain
(void
)更新:
一般編譯選項不會把除數優化為乘數,因為結果會有差異,所以應該這麼寫:
#include
/* srand(), rand(), RAND_MAX */#include
/* printf() */
#include
/* time()*/
intmain
()對比第三個 printf()的運算(x86-64 gcc 8.1, -O3):
; (4.0 * rand() / RAND_MAX) - 2.0call
rand
pxor
xmm0
,xmm0
cvtsi2sd
xmm0
,eax
mulsd
xmm0
,QWORD
PTR.LC2
[rip
]; <=
divsd
xmm0
,QWORD
PTR.LC0
[rip
]; <=
subsd
xmm0
,QWORD
PTR.LC3
[rip
]; rand() * (4.0 / RAND_MAX) - 2.0call
rand
pxor
xmm0
,xmm0
cvtsi2sd
xmm0
,eax
mulsd
xmm0
,QWORD
PTR.LC2
[rip
]; <=
subsd
xmm0
,QWORD
PTR.LC3
[rip
]原本乙個乘數、乙個除數,變成只有乙個乘數。對於這個問題,此改動不影響需求,也能提公升效能。
3樓:已登出
你要隨機生成乙個在一定範圍的數,你可以在巨集定義中定義乙個random(int number)函式,然後在main()裡面直接呼叫random()函式:
例如:隨機生成10個0~100的數:
#include
#include
#define random(x) (rand()%x)
void main()
上面例子所生成的隨機數都只能是一次性的,導致你第二次執行的時候輸出結果仍和第一次一樣。如果想第二次和第一次產生不同的數值,那就要用到隨機種子,這就與srand()函式有關。srand()用來設定rand()產生隨機數時的隨機數種子。
在呼叫rand()函式產生隨機數前,必須先利用srand()設好隨機數種子, 如果未設隨機數種子, rand()在呼叫時會自動設隨機數種子為1。上面的例子就是因為沒有設定隨機數種子,每次隨機數種子都自動設成相同值 ,進而導致rand()所產生的隨機數值都一樣。
srand()函式定義 :
void srand (unsigned int seed);
例如:#include
#include
#include
#define random(x) (rand()%x)
void main()
這樣兩次執行的結果就會不一樣了!!
用time(0)的話,要加入標頭檔案#include
擴充:x = rand()%11; /*產生1~10之間的隨機整數*/
y = rand()%51 - 25; /*產生-25 ~ 25之間的隨機整數*/
z = ((double)rand()/RAND_MAX)*(b-a) + a;/*產生區間[a,b]上的隨機數*/
(內容摘錄自CDSN部落格)
c語言如何生成隨機不重複的幾個數?
涇渭漳淮 如果你只是想獲得幾個或者幾十個隨機數,那最簡單的辦法就OK,拿個陣列把每次產生的隨機數存一下,然後產生新的隨機數之後查詢一下看看是不是重複了就行。如果你想獲得幾k甚至幾兆的隨機數,那查詢就變成了瓶頸,你需要換乙個查詢的方法,紅黑樹字典樹之類的都可以。如果你想獲得幾百兆甚至幾G個不重複的隨機...
C 如何生成不重複大隨機數?
悽臨雨 設計一種一一對映的函式f x 0 21億一一對映到0 21億 然後取前n個x,然後f 隨機種子 1 f 隨機種子 n 就是你要的前n個不相同的隨機數。至於如何產生這樣的函式?我們知道十進位制是A 10000 B 1000 E 1。對位的順序做交換 交換D和E,會變成00,10,20,30,9...
這種題用 C 語言除了用生成隨機數暴力猜答案之外,還能怎麼算?
Richard Xu 既然 靈劍 提到了 逼格 我初三的時候機緣巧合參加了NOIWC 09 當年的最後一題 優化設計 參見這裡 所以題主的這個問題其實就可以寫成45個布林變數 x12,x13,x110,x23,x910 然後用5個布林表示式來保證上述5個式子成立,再來10個布林表示式來保證每個數字不...