Re: [問題] 產生N個不重複的數列

看板C_and_CPP (C/C++)作者 (藍影)時間14年前 (2011/07/22 10:07), 編輯推噓1(1010)
留言11則, 3人參與, 最新討論串4/4 (看更多)

07/22 00:28,
那個需求不同,你指的是有限範圍中取不重複數字,但原po似乎
07/22 00:28

07/22 00:28,
要實數中取不重複數字.
07/22 00:28

07/22 00:43,
即使是要從實數裡取不重複的數字
07/22 00:43

07/22 00:44,
但是他的宣告仍然有範圍限制呀~~
07/22 00:44

07/22 01:31,
錯,同樣有範圍限制,實數跟整數差很多
07/22 01:31

07/22 01:42,
@yauhh:你似乎誤會我的意思了...
07/22 01:42

07/22 01:42,
我是指儲存的size是受限的...
07/22 01:42

07/22 01:46,
所以也可以用類似的方法去產生呀~~
07/22 01:46

07/22 05:28,
所謂實數是指rand產生的數字嗎?那這個例子只要改成for
07/22 05:28

07/22 05:29,
塞進去就好,在洗牌就好.
07/22 05:29

07/22 05:31,
實際上我寫過類似原po的方法,因為是亂數產生數字
07/22 05:31

07/22 05:32,
不論你怎麼檢查數值,還是會有重複的可能.所以採用洗牌法
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

07/22 10:47, , 1F
抽換版的方式 跟 直接生成的方式
07/22 10:47, 1F

07/22 17:21, , 2F
我覺得這樣也可以啦
07/22 17:21, 2F

07/22 17:22, , 3F
我原本的想法是直接分析float的組成
07/22 17:22, 3F

07/22 17:23, , 4F
因為float所能產生的浮點數數量是受限的
07/22 17:23, 4F

07/22 17:25, , 5F
以y大的說法可能是指範圍內的個數是有差
07/22 17:25, 5F

07/22 17:27, , 6F
而且直接以浮點數組成 是可以避免會有無法產生的浮點數...
07/22 17:27, 6F

07/23 00:22, , 7F
f大意指用到二個rnd,一個用在整數,一個用在小數嗎?
07/23 00:22, 7F

07/23 00:23, , 8F
是的話應要用到二個PRG,不然容易出包(不均勻等問題)
07/23 00:23, 8F

07/23 10:12, , 9F
應該是用到3個 sign exp fraction XD
07/23 10:12, 9F

07/23 10:15, , 10F
就是以IEEE 754 為基礎去實作 XD
07/23 10:15, 10F

07/23 13:06, , 11F
嗯嗯, 謝謝解釋 *^_^*
07/23 13:06, 11F
文章代碼(AID): #1EADjj7k (C_and_CPP)
文章代碼(AID): #1EADjj7k (C_and_CPP)