→ yauhh:那個需求不同,你指的是有限範圍中取不重複數字,但原po似乎07/22 00:28
→ yauhh:要實數中取不重複數字.07/22 00:28
→ firejox:即使是要從實數裡取不重複的數字07/22 00:43
→ firejox:但是他的宣告仍然有範圍限制呀~~07/22 00:44
→ yauhh:錯,同樣有範圍限制,實數跟整數差很多07/22 01:31
→ firejox:@yauhh:你似乎誤會我的意思了... 07/22 01:42
→ firejox:我是指儲存的size是受限的...07/22 01:42
→ firejox:所以也可以用類似的方法去產生呀~~07/22 01:46
→ angleevil:所謂實數是指rand產生的數字嗎?那這個例子只要改成for07/22 05:28
→ angleevil:塞進去就好,在洗牌就好.07/22 05:29
→ angleevil:實際上我寫過類似原po的方法,因為是亂數產生數字07/22 05:31
→ angleevil:不論你怎麼檢查數值,還是會有重複的可能.所以採用洗牌法07/22 05:32
我總算看懂各位在討論什麼了 XD
原 po 問題是什麼我已沒興趣了 (中文不好,看不懂敘述)
假設是產生 [LOW, HIGH] 不重覆之 N (10) 組浮點亂數 (float d[N])。
不知道有沒有誤會 firejox 之意,以 rand() 而言,作法類似如下
產生 0~X ( N << X <= RAND_MAX) 張 poker (int poker[X])
再進行 shuffle,取出前 N 張,並做數值上之調整。
X = RAND_MAX;
for(i=0; i!=X; ++i) poker[i]=i;
shuffle(poker, X);
for(i=0; i!=N; ++i)
d[i] = (float)(UP-LOW)*poker[i] / RAND_MAX + LOW;
值得探討的應是精度/速度問題,
精度愈高,X 愈大,生成 poker、shuffle 要愈久。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
推 ericinttu:抽換版的方式 跟 直接生成的方式 07/22 10:47
→ firejox:我覺得這樣也可以啦 07/22 17:21
→ firejox:我原本的想法是直接分析float的組成 07/22 17:22
→ firejox:因為float所能產生的浮點數數量是受限的 07/22 17:23
→ firejox:以y大的說法可能是指範圍內的個數是有差 07/22 17:25
→ firejox:而且直接以浮點數組成 是可以避免會有無法產生的浮點數... 07/22 17:27
→ tropical72:f大意指用到二個rnd,一個用在整數,一個用在小數嗎? 07/23 00:22
→ tropical72:是的話應要用到二個PRG,不然容易出包(不均勻等問題) 07/23 00:23
→ firejox:應該是用到3個 sign exp fraction XD 07/23 10:12
→ firejox:就是以IEEE 754 為基礎去實作 XD 07/23 10:15
→ tropical72:嗯嗯, 謝謝解釋 *^_^* 07/23 13:06