作者LPH66 (-858993460)
看板Programming
标题Re: [问题] 从0-99999选出一千个不重覆的乱数?
时间Wed May 26 09:23:10 2010
※ 引述《qeagle (神啊请让我失恋吧)》之铭言:
: 请问这题要怎麽着手
: 我想产生一些乱数序列以供测试排序功能用
: 产生乱数简单,但要保持其乱数产生顺序,又不能有重覆..
: 不知道大家会怎麽写好,先产生1000个,再一个个检查有无重覆吗...
: → james732:先建立一个阵列依序摆0-99999再随机交换 140.117.171.46 05/25 21:16
: → james732:整个阵列弄乱了,挑前1000个即可 140.117.171.46 05/25 21:16
: → j094097:一边产生一边检查跟前面有没有重复也可 210.85.71.161 05/25 21:18
: 推 cooper6334:一样是先阵列依序摆0-99999,然後抓乱数 111.252.104.88 05/25 21:57
: → WPC001:094097大的方法比较不好,会有机率不等的问 180.177.13.224 05/25 21:58
: → WPC001:题,用0-99999的阵列,然後弹出1000个较好 180.177.13.224 05/25 21:58
: → cooper6334:的时候就用for抓A[i]~A[99999]的值 111.252.104.88 05/25 21:59
: → cooper6334:再把抓到的值跟A[i]互换 111.252.104.88 05/25 21:59
: 推 zeat:http://tinyurl.com/o5uk3t 可以参考这个 122.118.34.155 05/26 07:25
唔 我得说演算法写的不好的话
洗牌法也会有机率不等的问题
回头检查的缺点并不是机率不等
而是在於愈後面的数字产生所需的期望乱数个数会变多 以及检查的比较时间
以这个问题来说 0~99999 取 1000 个数
平均得产生 1053.5 个乱数 以及约 50 万个比较 效率上是个很大的问题
这在取的数字变多时会更明显 例如取 5000 个数的话
平均需产生近 7000 个乱数 比较次数也上升到近二千万次
至於洗牌法的话 cooper6334 的方法很标准
这等於是每次随机从还没抽的扑克牌中抽一张出来的感觉
如果你是不管范围随机选两个数出来交换 那才会有机率不等的问题
--
'You've sort of made up for it tonight,' said Harry. 'Getting the
sword. Finishing the Horcrux. Saving my life.'
'That makes me sound a lot cooler then I was,' Ron mumbled.
'Stuff like that always sounds cooler then it really was,' said
Harry. 'I've been trying to tell you that for years.'
-- Harry Potter and the Deathly Hollows, P.308
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.84
※ 编辑: LPH66 来自: 140.112.30.84 (05/26 09:23)
1F:推 FRAXIS:洗牌法须要长度100000的阵列 140.119.162.50 05/26 12:33
2F:→ FRAXIS:应该有只要存1000个就够的方法吧 140.119.162.50 05/26 12:33
3F:推 meto000:配合杂凑函数? 140.120.190.14 05/26 17:03
4F:→ LPH66:配合杂凑的确是可以有效减少比较次数没错 140.112.30.84 05/26 17:24
5F:→ LPH66:但是产生的乱数个数期望值却不会减少 140.112.30.84 05/26 17:25