Re: [心得] 第一次使用亂數就上手 XD (random number)

看板C_and_CPP (C/C++)作者 (J.D.)時間12年前 (2012/11/19 14:52), 編輯推噓0(0012)
留言12則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《latinboy (暱稱)》之銘言: : 亂數是程式語言學習上的一個重點,學校的程式課程多半會教、出練習題, : 因此也是新手常遇到的問題。 : 在此列出一點C語言中亂數使用上的心得以及常犯錯誤 : == : [1] 入門用法 : srand( time(NULL) ); : for( i = 0; i < 10; i++ ) : printf( "Random number #%d: %d\n", i, rand() ); : 呼叫 srand()函式將亂數初始化,可以 time(NULL) 作為初始種子(seed), : 或自行設定任意數。不先呼叫本函數、或種子值固定,都會造成新手常見 : 的「每次執行產生的亂數結果都相同」問題。 : == : [2] 產生固定範圍的亂數 : # 0 ~ n-1 : 一般常見的寫法有: : 1. rand() % n; : 2. (int)( n * ( rand() / (float)(RAND_MAX+1) ) ); : 兩種寫法n的上限皆不能大於RAND_MAX,否則某些範圍內的數字永遠不會出現。(Why?) : 一般C語言的RAND_MAX只有32767,於使用上需特別注意。 : 第1種寫法在n有點大時( RAND_MAX/k < n <=RAND_MAX, say k < 5 )可能會出現 : 亂數分佈不均。因此以第2種為佳。 : # a ~ b : 將上面的寫法改一下,變成 a + ( 0 ~ (b-a+1) - 1 )即可。 : 也就是上面的 n 變成 b-a+1。 : == 請問為啥我照第2種寫法寫 為啥不是 0~n-1 而是 0 ~ 1-n 我印出來發現 RAND_MAX 2147483647 RAND_MAX+1 -2147483648 就變負數了 冠上float 變 -2.14748e+09 之後除下去也是負數 請問是 哪裡錯了? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.235.116

11/19 14:56, , 1F
因為原po的RAND_MAX是2^15-1 你的是2^31-1 XD
11/19 14:56, 1F

11/19 14:56, , 2F
quick fix應該是 (double)((unsigned)RAND_MAX) 這樣?
11/19 14:56, 2F

11/19 14:57, , 3F
(double)(((unsigned)RAND_MAX)+1u) 這樣
11/19 14:57, 3F

11/19 15:01, , 4F
喔喔喔 ~~
11/19 15:01, 4F

11/19 15:01, , 5F
感謝
11/19 15:01, 5F

11/19 15:28, , 6F
是因為Compiler不同所造成的?
11/19 15:28, 6F

11/19 16:41, , 7F
時代在變,compiler也在變,沒有大便也要有小便。
11/19 16:41, 7F

11/19 21:04, , 8F
^好像怪怪的XD
11/19 21:04, 8F

11/20 02:34, , 9F
沒有大便的話最好去看醫生=A=
11/20 02:34, 9F

11/20 10:45, , 10F
可以挑戰看看大便不小便
11/20 10:45, 10F

11/20 17:37, , 11F
對不起推文好像變成土色了 :(
11/20 17:37, 11F

11/20 19:46, , 12F
推文在我的terminal本來就是土色的也.......
11/20 19:46, 12F
文章代碼(AID): #1GgTT8rX (C_and_CPP)
文章代碼(AID): #1GgTT8rX (C_and_CPP)