看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc08 問題(Question): 請教一下 rand產生像只有到32767,能產生超過32767的數值嗎? 我試著改成這個樣子 long rand_number= rand()%(2147483647); 好像也不太行 不知道有沒有好方法 謝謝幫忙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.136.149.125
lovesnake:rand * rand? 05/14 18:12
lovesnake:這樣夠大了吧XD 還是你要三次方 www 05/14 18:12
lovesnake:不過這樣會影響機率啦~ 不介意的話 05/14 18:14
lovesnake:在不然就自己實作亂數產生器囉~ 05/14 18:14
bernachom:今天看書上寫,忘了是哪本書,他說有lrand_max() 05/14 18:15
bernachom:最大是2147483647 05/14 18:15
bernachom:不知道他是可以產生到這麼大,還是最大可以到這樣..@@ 05/14 18:16
bernachom:然後我又查到JAVA好像範圍更大 05/14 18:16
bernachom:想試看看C++行不行這樣子.. 05/14 18:17
sjgau:(rand() << 15) + (rand()); 05/14 18:20
bernachom:請教一下,所以這樣子產生出來的最大數是2147483647嗎? 05/14 18:33
bernachom:謝謝 05/14 18:33
bernachom:我爬文後,查到還有其它方式 05/14 18:55
bernachom:不過我想問的是,超過32767的數值是不是很不平均產生呢? 05/14 18:56
bernachom:謝謝 05/14 18:56
Chikei:vs08又是C++建議直接用tr1/random 05/14 19:43
chunhsiang:對 RAND*RAND不會是平均分布 05/14 20:20
bernachom:我查到的是這個 05/14 21:04
bernachom:(rand() << 17) + (rand() << 2) + (rand() & 3) 05/14 21:05
bernachom:感覺和上面的推文差不多的方式,應該是平均分佈才是.. 05/14 21:05
EdisonX:lrand_max() 是非標準. std::tr1::mt19937 好用 !! 05/14 21:20
EdisonX:要自己搞,不考慮多行緒的話, http://codepad.org/XujKfNzP 05/14 21:21
bernachom:我試試看,我沒用過這個~ 05/14 21:43
bernachom:不過上面那個我推文找的那個會有問題嗎? 05/14 21:44
bernachom:因為他可以表示32bit unsigned int,感覺還不錯@@ 05/14 21:44
EdisonX:若只是拿來做簡單統計可以,但有些數值一定產生不出來, 05/14 21:45
bernachom:真的假的@@產不出來... 05/14 21:46
EdisonX:如組合後之結果絕不可能為0,因rand()不會連續出現相同數. 05/14 21:46
bernachom:因為我最真的有跑過32bit 能表示的最大數測試過 05/14 21:46
bernachom:可是我有跑出0過耶!! 05/14 21:47
bernachom:我0和32bit的最大值都試過,都有跑出來,可是要等一陣子 05/14 21:47
bernachom:我是隨便用迴圈下去跑的,跑個1000萬次還100萬次 05/14 21:48
bernachom:有找到0或32bit最大表示值的就印出來 05/14 21:48
bernachom:然後等了一陣子才看到...才放心一下下QQ 05/14 21:48
EdisonX:我驗證的結果似乎與你不同 http://codepad.org/KkDnww5D 05/14 21:54
bernachom:我來試試看 05/14 21:57
bernachom:http://codepad.org/Rl7jAEal 05/14 22:07
bernachom:跑了好久,0還沒出來,可是最大數出來兩個了...冏 05/14 22:07
bernachom:可是我今天真的有看到0過呀QQ 05/14 22:08
EdisonX:oh, 那就拿上面方法做就好了. 05/14 22:09
bernachom:不過我還是在搞懂您說的lrand_max() 05/14 22:10
bernachom:我去試一下怎麼用..>///< 05/14 22:10
flydragon198:我跑http://codepad.org/KkDnww5D 印出來看,結果發 05/14 22:51
flydragon198:現數值竟然都會一樣耶@@?? 05/14 22:51
flydragon198:http://codepad.org/kc4Njy2k code有稍微改一下來看 05/14 22:56
bernachom:會印出負的? 05/14 22:58
flydragon198:每一百億次印出來都會是 http://ppt.cc/tTs! 05/14 22:59
flydragon198:說錯,是十億次 05/14 23:00
bernachom:確實很怪.話說,我今天有跑出0,可是剛才測都一直沒出現 05/14 23:01
bernachom:.............冏 05/14 23:01
bernachom:不知道是範圍太大很難出現,還是分佈不平均 = = 05/14 23:02
bernachom:我今天好像是用這個試的.. 05/14 23:10
bernachom:1+( (rand() << 17) + (rand() << 2) + (rand() & 3) -1 05/14 23:11
bernachom:我等一下再試看看好了..T_T 05/14 23:11
flydragon198:如果跑的結果都會一樣,試幾次可能都一樣,以前我在 05/14 23:11
flydragon198:寫這個的時候,我記得好像在rand()的()內有加變數還 05/14 23:12
flydragon198:是哪裡有加什麼去打亂變數種子的樣子~~~ 05/14 23:12
bernachom:我寫的那個我還沒看過,全部的值,我等一下來確認一下 05/14 23:12
bernachom:您說的每一百億次印出來都是一樣的值 05/14 23:16
bernachom:是說每一百億次就重複一次的意思嗎? 05/14 23:17
bernachom:我看我寫的好像沒有重複耶?不過我只看前10個而已 05/14 23:17
flydragon198:srand(time(NULL)); 將這一行加在for迴圈第一行 05/14 23:17
flydragon198:我是加上這行,就不會重複了~~~ 05/14 23:18
bernachom:....冏....原來是忘了加... 05/14 23:19
flydragon198:你記錄前十個的值,然後重新跑一遍,還會是同樣的十 05/14 23:29
flydragon198:個值,每次重複跑都會一樣~~ 05/14 23:29
bernachom:沒有呀@@?http://codepad.org/egHWgFf0 05/14 23:32
bernachom:我直接按F5看,好像也都不一樣 05/14 23:32
flydragon198:你有加srand的這個不會~~~~ 05/14 23:35
bernachom:我一直以為你跟我是加了之後還會.... 05/14 23:36
flydragon198:http://codepad.org/KkDnww5D 這個版本就會~~ 05/14 23:36
bernachom:我知道了,謝謝^_^ 05/14 23:38
amozartea:比照大數阿, 寫個陣列每個位置0~9? 05/15 01:30
blackwindy:剛剛才看到這篇...怎麼一堆人都沒加srand 05/21 13:31
blackwindy:你不打亂seed出來的亂數當然就會有重複的現象 05/21 13:31