通过n次循环获得n个自然数随机排序

博客源于网友在51js提出用JS随机打乱1到100顺序的问题,这属于洗牌问题。博主曾用C语言为扑克游戏设计过高效洗牌算法,现决定用JavaScript重新实现。还指出洗牌算法与获取随机序列不同,洗牌要求处理后的序列元素唯一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    刚才在51js看到有网友问,"1到100一百个数,怎么用JS来随机打乱它们的顺序呢?"。他说的这个不就是洗牌问题嘛,想起原来自己在做一个扑克游戏的时候设计过一个高效的洗牌算法,n个自然数通过n次循环搞定(当时是54个,扑克嘛)。

    只是那个扑克牌程序是用C语言写的,不过用什么语言有什么区别呢?显然没有了,那今天就用JavaScript再实现一下。简单说明一下,洗牌算法虽然是用随机函数来排序,不过和获得随即序列大不一样。随即序列里可以有重复,不过洗牌要求处理后的随即序列元素是unique的,扑克牌能有相同的吗?所以需要先生成被排序序列来保证唯一性,假如是一个1-100的自然数数组。排序代码如下:

None.gif < html >
None.gif
< head >
None.gif    
< title > JavaScript Shuffle Arithmetic </ title >
None.gif    
< meta  name ="author"  content ="birdshome@cnblogs"   />
None.gif
</ head >
None.gif
< body >
ExpandedBlockStart.gifContractedBlock.gif    
< script  language ="javascript" > dot.gif
InBlock.gif
var sequence = new Array(100);
InBlock.gif
for ( var i=0 ; i < 100 ; i++ )
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    sequence[i] 
= i+1;
ExpandedSubBlockEnd.gif}

InBlock.gifalert(Shuffle(sequence));
InBlock.gif
InBlock.gif
function Shuffle(ary)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
for ( var i=ary.length-1 ; i >= 0 ; i-- )
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif         
var v = parseInt(Math.random()*(i+1));
InBlock.gif         
var tmp = ary[v];
InBlock.gif         ary[v] 
= ary[i];
InBlock.gif         ary[i] 
= tmp;   
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return ary; 
ExpandedBlockEnd.gif}

None.gif
</ script >
None.gif
</ body >
None.gif
</ html >
None.gif

    某一次排序结果为:60, 88, 2, 6, 52, 45, 37, 12, 49, 41, 68, 27, 80, 86, 100, 53, 99, 33, 57, 91, 10, 63, 50, 54, 97, 93, 30, 56, 13, 11, 23, 36, 32, 58, 72, 21, 95, 17, 18, 26, 59, 35, 90, 87, 78, 73, 77, 75, 89, 47, 28, 70, 1, 15, 66, 84, 98, 44, 4, 20, 74, 25, 76, 61, 65, 29, 38, 42, 85, 96, 34, 7, 24, 92, 22, 62, 79, 48, 14, 43, 69, 46, 94, 55, 81, 71, 82, 39, 40, 31, 8, 19, 3, 9, 83, 51, 5, 67, 16, 64。

    五行代码的算法,就不解释了。您还有更优的吗 emteeth.gif

转载于:https://www.cnblogs.com/birdshome/archive/2005/04/09/134840.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值