看板java
标 题Re: [问题] 1-42取出6+1个数字
发信站资讯传奇 (Sun Jul 23 12:08:37 2006)
转信站ptt!ctu-reader!Spring!ctu-gate!news.nctu!ccnews.nchu!ccnews.thu!inf
【 在
[email protected] (遥远的旅人) 的大作中提到: 】
: ※ 引述《ogamenewbie (._.)》之铭言:
: : (举手) 问几个问题...
: : 这个看起来是从阵列最後方, 随机选一个之前的元素跟後面的置换.
: : 然後把整个阵列 n 跑完之後, 取前面的 m 个...
: : 那为什麽不直接後面作 m 次以後直接取後面的 m 个呢?
: 当然可以阿,这样聪明多了。
: 那个pseudo Code是Trace来的,我只是直接把脑子里的东西贴上用,
: 看来我还消化的不够彻底,感谢指点。
: : 另外取前面 n 个, 第一个会永远不可能是自己吧?
: 不会,第n-1个跟之前连自己共n个元素作Swap也有可能取到自己啊。
: 所以虽然机率超低也还是有机会的。
: : 最後感谢你提供 (对我来说) 如此易於了解的方法.
我想这就是洗牌法的延伸吧
像扑克牌洗牌一样,假设n张牌一开始都照顺序排好 (阵列初始为1~n)
洗一次牌就是任选两张牌然後彼此交换位置 (阵列中任选2位置彼此Swap值)
要洗几次就看你想要乱数有多乱,洗越多次理论上越乱,
最後要取出m个不重复的值 就从阵列中随机取m个位置然後取值就好
不管是1-42 或1-400000 都可以这样做,且复杂度是一样的 XD
--
世界上有不能流泪的哀伤存在.那是对谁也无法说明的,
就算能够说明,谁也不会理解的那种东西.那哀伤既不能
改变成任何形式,只能像无风之夜的雪那样静静地逐渐
积在心里而已.
--
※ 来源:‧资讯传奇 inf.csie.thu.edu.tw‧[FROM: 220-139-169-158.dynamic.hinet.]