[問題] 產生超過32767的亂數

看板C_and_CPP (C/C++)作者 (Terry)時間14年前 (2012/05/14 18:10), 編輯推噓12(12063)
留言75則, 9人參與, 最新討論串1/4 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc08 問題(Question): 請教一下 rand產生像只有到32767,能產生超過32767的數值嗎? 我試著改成這個樣子 long rand_number= rand()%(2147483647); 好像也不太行 不知道有沒有好方法 謝謝幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.136.149.125

05/14 18:12, , 1F
rand * rand?
05/14 18:12, 1F

05/14 18:12, , 2F
這樣夠大了吧XD 還是你要三次方 www
05/14 18:12, 2F

05/14 18:14, , 3F
不過這樣會影響機率啦~ 不介意的話
05/14 18:14, 3F

05/14 18:14, , 4F
在不然就自己實作亂數產生器囉~
05/14 18:14, 4F

05/14 18:15, , 5F
今天看書上寫,忘了是哪本書,他說有lrand_max()
05/14 18:15, 5F

05/14 18:15, , 6F
最大是2147483647
05/14 18:15, 6F

05/14 18:16, , 7F
不知道他是可以產生到這麼大,還是最大可以到這樣..@@
05/14 18:16, 7F

05/14 18:16, , 8F
然後我又查到JAVA好像範圍更大
05/14 18:16, 8F

05/14 18:17, , 9F
想試看看C++行不行這樣子..
05/14 18:17, 9F

05/14 18:20, , 10F
(rand() << 15) + (rand());
05/14 18:20, 10F

05/14 18:33, , 11F
請教一下,所以這樣子產生出來的最大數是2147483647嗎?
05/14 18:33, 11F

05/14 18:33, , 12F
謝謝
05/14 18:33, 12F

05/14 18:55, , 13F
我爬文後,查到還有其它方式
05/14 18:55, 13F

05/14 18:56, , 14F
不過我想問的是,超過32767的數值是不是很不平均產生呢?
05/14 18:56, 14F

05/14 18:56, , 15F
謝謝
05/14 18:56, 15F

05/14 19:43, , 16F
vs08又是C++建議直接用tr1/random
05/14 19:43, 16F

05/14 20:20, , 17F
對 RAND*RAND不會是平均分布
05/14 20:20, 17F

05/14 21:04, , 18F
我查到的是這個
05/14 21:04, 18F

05/14 21:05, , 19F
(rand() << 17) + (rand() << 2) + (rand() & 3)
05/14 21:05, 19F

05/14 21:05, , 20F
感覺和上面的推文差不多的方式,應該是平均分佈才是..
05/14 21:05, 20F

05/14 21:20, , 21F
lrand_max() 是非標準. std::tr1::mt19937 好用 !!
05/14 21:20, 21F

05/14 21:21, , 22F
要自己搞,不考慮多行緒的話, http://codepad.org/XujKfNzP
05/14 21:21, 22F

05/14 21:43, , 23F
我試試看,我沒用過這個~
05/14 21:43, 23F

05/14 21:44, , 24F
不過上面那個我推文找的那個會有問題嗎?
05/14 21:44, 24F

05/14 21:44, , 25F
因為他可以表示32bit unsigned int,感覺還不錯@@
05/14 21:44, 25F

05/14 21:45, , 26F
若只是拿來做簡單統計可以,但有些數值一定產生不出來,
05/14 21:45, 26F

05/14 21:46, , 27F
真的假的@@產不出來...
05/14 21:46, 27F

05/14 21:46, , 28F
如組合後之結果絕不可能為0,因rand()不會連續出現相同數.
05/14 21:46, 28F

05/14 21:46, , 29F
因為我最真的有跑過32bit 能表示的最大數測試過
05/14 21:46, 29F

05/14 21:47, , 30F
可是我有跑出0過耶!!
05/14 21:47, 30F

05/14 21:47, , 31F
我0和32bit的最大值都試過,都有跑出來,可是要等一陣子
05/14 21:47, 31F

05/14 21:48, , 32F
我是隨便用迴圈下去跑的,跑個1000萬次還100萬次
05/14 21:48, 32F

05/14 21:48, , 33F
有找到0或32bit最大表示值的就印出來
05/14 21:48, 33F

05/14 21:48, , 34F
然後等了一陣子才看到...才放心一下下QQ
05/14 21:48, 34F

05/14 21:54, , 35F
我驗證的結果似乎與你不同 http://codepad.org/KkDnww5D
05/14 21:54, 35F

05/14 21:57, , 36F
我來試試看
05/14 21:57, 36F

05/14 22:07, , 37F

05/14 22:07, , 38F
跑了好久,0還沒出來,可是最大數出來兩個了...冏
05/14 22:07, 38F

05/14 22:08, , 39F
可是我今天真的有看到0過呀QQ
05/14 22:08, 39F

05/14 22:09, , 40F
oh, 那就拿上面方法做就好了.
05/14 22:09, 40F

05/14 22:10, , 41F
不過我還是在搞懂您說的lrand_max()
05/14 22:10, 41F

05/14 22:10, , 42F
我去試一下怎麼用..>///<
05/14 22:10, 42F

05/14 22:51, , 43F
我跑http://codepad.org/KkDnww5D 印出來看,結果發
05/14 22:51, 43F

05/14 22:51, , 44F
現數值竟然都會一樣耶@@??
05/14 22:51, 44F

05/14 22:56, , 45F
http://codepad.org/kc4Njy2k code有稍微改一下來看
05/14 22:56, 45F

05/14 22:58, , 46F
會印出負的?
05/14 22:58, 46F

05/14 22:59, , 47F
每一百億次印出來都會是 http://ppt.cc/tTs!
05/14 22:59, 47F

05/14 23:00, , 48F
說錯,是十億次
05/14 23:00, 48F

05/14 23:01, , 49F
確實很怪.話說,我今天有跑出0,可是剛才測都一直沒出現
05/14 23:01, 49F

05/14 23:01, , 50F
.............冏
05/14 23:01, 50F

05/14 23:02, , 51F
不知道是範圍太大很難出現,還是分佈不平均 = =
05/14 23:02, 51F

05/14 23:10, , 52F
我今天好像是用這個試的..
05/14 23:10, 52F

05/14 23:11, , 53F
1+( (rand() << 17) + (rand() << 2) + (rand() & 3) -1
05/14 23:11, 53F

05/14 23:11, , 54F
我等一下再試看看好了..T_T
05/14 23:11, 54F

05/14 23:11, , 55F
如果跑的結果都會一樣,試幾次可能都一樣,以前我在
05/14 23:11, 55F

05/14 23:12, , 56F
寫這個的時候,我記得好像在rand()的()內有加變數還
05/14 23:12, 56F

05/14 23:12, , 57F
是哪裡有加什麼去打亂變數種子的樣子~~~
05/14 23:12, 57F

05/14 23:12, , 58F
我寫的那個我還沒看過,全部的值,我等一下來確認一下
05/14 23:12, 58F

05/14 23:16, , 59F
您說的每一百億次印出來都是一樣的值
05/14 23:16, 59F

05/14 23:17, , 60F
是說每一百億次就重複一次的意思嗎?
05/14 23:17, 60F

05/14 23:17, , 61F
我看我寫的好像沒有重複耶?不過我只看前10個而已
05/14 23:17, 61F

05/14 23:17, , 62F
srand(time(NULL)); 將這一行加在for迴圈第一行
05/14 23:17, 62F

05/14 23:18, , 63F
我是加上這行,就不會重複了~~~
05/14 23:18, 63F

05/14 23:19, , 64F
....冏....原來是忘了加...
05/14 23:19, 64F

05/14 23:29, , 65F
你記錄前十個的值,然後重新跑一遍,還會是同樣的十
05/14 23:29, 65F

05/14 23:29, , 66F
個值,每次重複跑都會一樣~~
05/14 23:29, 66F

05/14 23:32, , 67F
05/14 23:32, 67F

05/14 23:32, , 68F
我直接按F5看,好像也都不一樣
05/14 23:32, 68F

05/14 23:35, , 69F
你有加srand的這個不會~~~~
05/14 23:35, 69F

05/14 23:36, , 70F
我一直以為你跟我是加了之後還會....
05/14 23:36, 70F

05/14 23:36, , 71F
http://codepad.org/KkDnww5D 這個版本就會~~
05/14 23:36, 71F

05/14 23:38, , 72F
我知道了,謝謝^_^
05/14 23:38, 72F

05/15 01:30, , 73F
比照大數阿, 寫個陣列每個位置0~9?
05/15 01:30, 73F

05/21 13:31, , 74F
剛剛才看到這篇...怎麼一堆人都沒加srand
05/21 13:31, 74F

05/21 13:31, , 75F
你不打亂seed出來的亂數當然就會有重複的現象
05/21 13:31, 75F
文章代碼(AID): #1FiDd-eE (C_and_CPP)
文章代碼(AID): #1FiDd-eE (C_and_CPP)