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

简介:

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

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

< html >
< head >
     < title >JavaScript Shuffle Arithmetic </ title >
     < meta  name ="author"  content ="birdshome@cnblogs"   />
</ head >
< body >
     < script  language ="javascript" >
var  sequence  =   new  Array( 100 );
for  (  var  i = 0  ; i  <   100  ; i ++  )
{
    sequence[i] 
=  i + 1 ;
}

alert(Shuffle(sequence));

function  Shuffle(ary)
{
    
for  (  var  i = ary.length - 1  ; i  >=   0  ; i --  )
    
{
         
var  v  =  parseInt(Math.random() * (i + 1 ));
         
var  tmp  =  ary[v];
         ary[v] 
=  ary[i];
         ary[i] 
=  tmp;   
    }

    
return  ary; 
}

</ script >
</ body >
</ html >

    某一次排序结果为: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。

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


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
6月前
|
算法 JavaScript 测试技术
【数学】【组合数学】1830. 使字符串有序的最少操作次数
【数学】【组合数学】1830. 使字符串有序的最少操作次数
|
1月前
循环输出指定区间范围的偶数
【10月更文挑战第14天】循环输出指定区间范围的偶数。
41 3
|
5月前
循环迭代判断\找质数——以每行8个的形式输出100-999内的质数
循环迭代判断\找质数——以每行8个的形式输出100-999内的质数
57 5
|
6月前
|
机器学习/深度学习 算法 测试技术
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
|
6月前
|
算法 测试技术 C#
【最大公约数 排序】2344. 使数组可以被整除的最少删除次数
【最大公约数 排序】2344. 使数组可以被整除的最少删除次数
|
6月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
117 0
复习C部分:1.for循环 2.do while循环语句 3.在一个有序数组中查找某个数,例如在1~10之间找7(例题包含计算n的阶乘+打印1~10的奇数+二分法)
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
157 0
复习C部分:1.看代码求值题 2.写三个整数代码从大到小输出 3.打印1~100中所有3的倍数 4.给定两个数,求最大公约数(递减法,辗转相除法)
求两个升序序列的中位数( 减治法)
题目: 一个长度为L(L≥1)的升序序列S,处在第L/2(若为小数则去掉小数后加1)个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试实现一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
求两个升序序列的中位数( 减治法)
给你一组数,求出其中两两最大公约数中最大的值
给你一组数,求出其中两两最大公约数中最大的值
65 0