看板 C_and_CPP 關於我們 聯絡資訊
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