[問題] 如何製造差異很大的亂數?

看板C_and_CPP作者 (uioty)時間8年前 (2016/05/09 06:13), 8年前編輯推噓9(9024)
留言33則, 13人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) No 問題(Question): 想要製造出一串亂數,希望這些亂數的差異要很大。 目前的亂數是取 rand()%10000 結果產生出的亂數大部分都是四位數 希望可以產生出 0,1234, 99, 567, 10080...等等差異很大的 餵入的資料(Input): 跑程式的時候用argv 讀入要產生多少亂數 預期的正確結果(Expected Output): 就是希望可以產生更亂的數字這樣 錯誤結果(Wrong Output):程式碼(Code):(請善用置底文網頁, 記得排版) 就是一般的亂數程式碼,例如 srand(time(null)); int n = rand()%10000; 這樣 補充說明(Supplement): 是要跑simplescalar,分析cache效能用的 (分析在某個排序演算法中,cache設定值的數據) 因為目前產生出的數字都是四位數 跑出來的數據好像不論在哪種associativity的設定都相差不大 然後就自己去手動產生了一串差異較大的數字,發現這樣數據會比較有趣(?) 想說是不是亂數產生的部分要再亂一點... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 66.215.98.249 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1462745608.A.AD7.html

05/09 06:36, , 1F
多寫幾個function, 分別產生1位數, 2位數, ...的
05/09 06:36, 1F

05/09 06:37, , 2F
再寫一個function, 來決定每次要用哪個function產生數字(?)
05/09 06:37, 2F

05/09 06:38, , 3F
多寫幾個function->可以用一個function, 參數傳幾位數這樣
05/09 06:38, 3F

05/09 06:39, , 4F
..... 請問你有學過機率嗎?
05/09 06:39, 4F

05/09 08:05, , 5F
會不會是你取亂數時間太近,看你用time()來取,把取亂數時間
05/09 08:05, 5F

05/09 08:05, , 6F
拉長試試
05/09 08:05, 6F
好的謝謝各位 我等一下來試試看~ (我學過機率 不過學得滿糟糕的XD 一直有打算再自修一次 >"<...) ※ 編輯: uioty (66.215.98.249), 05/09/2016 09:23:40

05/09 09:26, , 7F
你這樣有條件的亂數還算是亂數嗎?XD
05/09 09:26, 7F

05/09 09:37, , 8F
那樣就不叫亂數了阿.......
05/09 09:37, 8F

05/09 09:38, , 9F
0~10000有90%的數字都是四位數,當然都看到四位數阿..
05/09 09:38, 9F

05/09 09:49, , 10F
哈哈哈 XD
05/09 09:49, 10F
XDDD 對吼

05/09 10:18, , 11F
剛剛忘了考慮機率,那你應該要把1,2,3,4位數的機率拉平,像
05/09 10:18, 11F

05/09 10:18, , 12F
是各亂數取20個再亂數放到陣列,再亂數取陣列的吧
05/09 10:18, 12F

05/09 10:40, , 13F
阿rand()產生n和p 回傳n * pow(10, p)不就結了
05/09 10:40, 13F

05/09 10:41, , 14F
p 範圍從正取到負就如你所想
05/09 10:41, 14F

05/09 10:41, , 15F
真正的亂數,差異應該是隨機的,每次都差很多反而不
05/09 10:41, 15F

05/09 10:41, , 16F
太像真實的亂數
05/09 10:41, 16F

05/09 11:01, , 17F
你只要不要採取一樓的做法就好
05/09 11:01, 17F

05/09 11:25, , 18F
沒事,我看錯了。不過那種方式就變成有條件的亂數了
05/09 11:25, 18F

05/09 11:26, , 19F
另外,關於亂數的產生,請絕對不要自己寫,麻煩用已知的
05/09 11:26, 19F

05/09 11:28, , 20F
generator,如rand或srand(不太好),或<random>裡的
05/09 11:28, 20F
好的 那我大概知道怎麼做了 謝謝各位 >__< ※ 編輯: uioty (66.215.98.249), 05/09/2016 13:03:18 ※ 編輯: uioty (66.215.98.249), 05/09/2016 13:06:24

05/10 20:26, , 21F
要找到如這種曲線的方程式 http://imgur.com/ld6TKqz
05/10 20:26, 21F

05/10 20:26, , 22F
透過均勻分布亂數 x 得到對應的 y
05/10 20:26, 22F

05/10 20:27, , 23F
方程式的兩端要保持平滑、中間要陡
05/10 20:27, 23F

05/10 20:29, , 24F
這參考看看 http://ideone.com/vaJ3bp
05/10 20:29, 24F

05/11 00:43, , 25F
..................保重 T_T
05/11 00:43, 25F

05/11 04:21, , 26F
如果想產生亂數的各種位數分佈的機率差不多的話:
05/11 04:21, 26F

05/11 04:22, , 27F
int rand10(int exp10) {
05/11 04:22, 27F

05/11 04:23, , 28F
int min=(int)pow(10, exp10-1), num=min*9;
05/11 04:23, 28F

05/11 04:24, , 29F
return (rand()%exp10) ? (rand10(--exp10))
05/11 04:24, 29F

05/11 04:24, , 30F
: (rand()%num+min); }
05/11 04:24, 30F

05/11 07:08, , 31F
為何不用Std 的distribution 還要繼續用舊的rand
05/11 07:08, 31F

05/11 12:09, , 32F
distribution 是 Cpp11,我還在用老版本…
05/11 12:09, 32F

05/11 12:31, , 33F
因為網路上的範例都是rand。因為教授不會用C++11
05/11 12:31, 33F
文章代碼(AID): #1NBxe8hN (C_and_CPP)