[問題] 隨機亂數rand()的問題

看板C_and_CPP (C/C++)作者 (香吉士)時間16年前 (2009/05/16 00:25), 編輯推噓7(7033)
留言40則, 8人參與, 最新討論串1/4 (看更多)
#include<iostream> #include<stdlib.h> #include<ctime> using namespace std; int main(){ srand( static_cast<unsigned int>(time(NULL))); //隨機函式 int a = 11 + static_cast<int>( 1. * rand() * 10 / (RAND_MAX + 1.)); cout << a << endl; system("pause"); return 0; } 請教一下各位大大 我想要產生11~20的隨機亂數 但是為什麼執行結果都相同呢? 我是用深度學習C++自學 我是照書上打的 請問這個改良式的亂數產生方法哪裡錯了呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.232.173

05/16 00:36, , 1F
為啥不用 % ?這方法好迂迴喔
05/16 00:36, 1F

05/16 01:06, , 2F
a%10+11這樣不是很簡單= =?
05/16 01:06, 2F

05/16 01:48, , 3F
time函數回從午夜00:00:00起所經過秒數
05/16 01:48, 3F

05/16 01:49, , 4F
因此若要有0.5的變化需耗時 0.5 x ( RAND_MAX+1 )/10秒
05/16 01:49, 4F

05/16 01:50, , 5F
你現在如果再跑一次 應該有變一點點吧XD
05/16 01:50, 5F

05/16 01:53, , 6F
不知道我有沒有說錯?
05/16 01:53, 6F

05/16 01:56, , 7F
sosokill 的寫法,產生的亂數很容易就不平均
05/16 01:56, 7F

05/16 01:56, , 8F
理由有二,讓其他人補充吧,要睡了...
05/16 01:56, 8F

05/16 02:48, , 9F
time不是從1970開始的秒數嗎? 又,秒數跟RAND_MAX的關係?
05/16 02:48, 9F

05/16 02:55, , 10F
只有 %10 而已應該不會太不平均...
05/16 02:55, 10F

05/16 06:43, , 11F
這code跑起來一點問題都沒有啊
05/16 06:43, 11F

05/16 06:47, , 12F
樓上大大 為什麼我用Dev-c++跑 每次結果都一樣 
05/16 06:47, 12F

05/16 11:22, , 13F
%10+11是會怎樣不平均我倒想知道,yk先生的虛擬亂數值域
05/16 11:22, 13F

05/16 11:22, , 14F
是只有0..15嗎?
05/16 11:22, 14F

05/16 12:27, , 15F
學生交交作業沒差,最好不要用於嚴謹的場合
05/16 12:27, 15F

05/16 12:33, , 16F
小弟資質駑鈍, 看不出這樣的寫法和%10+11有什麼差別.
05/16 12:33, 16F

05/16 12:34, , 17F
把rand()的值域展開來看套下去原po式子算感覺是一樣的.
05/16 12:34, 17F

05/16 12:34, , 18F
最主要原因,請參考 http://tinyurl.com/px9ep7
05/16 12:34, 18F

05/16 12:35, , 19F
另一個原因,jlovet 應該知道 :)
05/16 12:35, 19F

05/16 12:37, , 20F
亂數範圍是2, 4, 8, 16, 32這種用low-bits好像還OK....
05/16 12:37, 20F

05/16 12:38, , 21F
話說新的這個方法前N-1個分布是比較平均, 但最後一個落
05/16 12:38, 21F

05/16 12:39, , 22F
點的機率會比前面N-1個都小一點囉??
05/16 12:39, 22F

05/16 12:40, , 23F
pseudo random number 很少有每個 bit 都一樣亂的
05/16 12:40, 23F

05/16 12:41, , 24F
這是很現實問題
05/16 12:41, 24F

05/16 12:44, , 25F
以前想過, 如果數學上某一小部份的數比另一大部份的數基
05/16 12:44, 25F

05/16 12:44, , 26F
率不相同, 那取到這小部份的數就捨棄掉重取, 不知可不可
05/16 12:44, 26F

05/16 12:45, , 27F
行....XD
05/16 12:45, 27F

05/16 12:49, , 28F
這樣有作弊的嫌疑,很難弄得好
05/16 12:49, 28F

05/16 12:54, , 29F
這倒是, 我要算0~N的亂數, 還得先找個>N的M, 確定M裡至
05/16 12:54, 29F

05/16 12:55, , 30F
少有N個數的rand()機率相等, 然後去求; 想到就累了Orz
05/16 12:55, 30F

05/16 13:30, , 31F
我只知道,現在libc的rand是跟random一樣
05/16 13:30, 31F

05/16 13:30, , 32F
period很大,所以lower bit跟higher bit幾乎一樣亂...
05/16 13:30, 32F

05/16 15:27, , 33F
那麼有信心,哪個版本的 libc? 用哪種演算法?
05/16 15:27, 33F

05/16 15:28, , 34F
如果你測試過,覺得夠亂那就好,但並非每種場合都適用
05/16 15:28, 34F

05/16 15:29, , 35F
夠亂不只是夠平均就好喔,要沒明顯的模式或相依性
05/16 15:29, 35F

05/16 15:30, , 36F
這在統計上,有明確的定義...
05/16 15:30, 36F

05/16 15:34, , 37F
一個嚴謹的要求是要任意長度的隨機序列出現的頻率都要一致
05/16 15:34, 37F

05/16 15:37, , 38F
任何嚴謹隨機數應用,最好都測試過,看是否達到需求
05/16 15:37, 38F

05/16 15:38, , 39F
我知道的,很少有演算法產生的隨機數能通過全部檢定的
05/16 15:38, 39F

05/16 15:41, , 40F
通過全部檢定的演算法通常不實用,因為太耗運算了
05/16 15:41, 40F
文章代碼(AID): #1A3PUAjP (C_and_CPP)
文章代碼(AID): #1A3PUAjP (C_and_CPP)