javascript中的“彩票” – 排序算法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript中的“彩票” – 排序算法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3129字,纯文字阅读大概需要5分钟。
内容图文
![javascript中的“彩票” – 排序算法?](/upload/InfoBanner/zyjiaocheng/809/6f9d5f8e9a83489ea3ae256b8fd5ac2d.jpg)
我正在尝试理解我的帖子末尾的代码示例,我需要帮助.所以这应该是一个“乐透”.所以这就是我所看到的:
for( i = 1 ; i < 50 ; i++ ){ nums[ i ] = i ; }
这里它将i的值(将在1和49之间)分配给nums数组的每个第i个元素.所以我想这只是制作一个包含数字1到49的数组.实际上,考虑到后面的代码,我没有看到整行的重点.
for( i = 1 ; i < 50 ; i++ )
{
rand = Math.ceil( Math.random() * 49 ) ;
temp = nums[ i ] ;
nums[ i ] = nums[ rand ] ;
nums[ rand ] =temp ;
}
在这里我感到困惑.因此,它再次运行从1到49的标准循环,并且对于49次迭代中的每一次,它:
>将1到49之间的随机数分配给“rand”
>将’nums’列表的第i个值(它仍然只是i,对吗?)分配给temp(为什么?)
>将随机数分配给“nums”数组的第i个元素,因此大概如果它在i = 1,nums [i] = 1,现在而不是1,它是随机数.
>然后它将temp(这是原始值,无论如何)分配回nums数组的rand-th位置的值.
那么我在这里误会了什么?我不明白这一点.这是领先的?我读得对吗?据推测,在这个结尾,数组内部的数字混乱,然后最后它只选择前6个,这是6个“随机”数字.但为什么不做这样的事情:
var nums=[];
for(i=0; i<6; i++) {
nums[i] == Math.ceil(Math.random() * 49);
}
随着测试,以确保随机数不一样?
这是整个代码示例:
function init()
{
var panel = document.getElementById( "panel" ) ;
var i , rand , temp , str , nums = [] ;
for( i = 1 ; i < 50 ; i++ ){ nums[ i ] = i ; }
for( i = 1 ; i < 50 ; i++ )
{
rand = Math.ceil( Math.random() * 49 ) ;
temp = nums[ i ] ;
nums[ i ] = nums[ rand ] ;
nums[ rand ] =temp ;
}
str = "Your Six Lucky Numbers:<br>" ;
for( i = 1 ; i < 7 ; i++ )
{
str += nums[ i ] ;
if( i !== 6 ) { str += " - " ; }
}
panel.innerHTML = str;
}
document.addEventListener( "DOMContentLoaded" , init , false ) ;
解决方法:
该代码应该创建一个数字数组,然后将它们混洗.它几乎使用了Fisher-Yates shuffle,但并不完全.随机数生成中也存在错误.
将数字1到49放在数组中并非毫无意义,这些是以后使用的数字.它们没有被替换,它们只是在数组中移动.
下一个循环将对数组中的项进行洗牌,但首先让我们看一下随机数生成.这种创建随机数的方法是错误的:
rand = Math.ceil(Math.random() * 49); // Don't use this
Math.random()方法返回一个值0< = x< 1.将该数字乘以49然后使用Math.ceil不会产生1到49之间的数字,它会产生0到49之间的数字.数字0很少出现,但你不能忽略它.生成随机数的正确方法是:
rand = Math.floor(Math.random() * 49) + 1;
用于对数组中的项进行洗牌的代码循环遍历项目并随机选择项目以交换每个项目.这会产生一个有偏差的shuffle,它应该使用Fisher-Yates算法:
for (i = 49 ; i >= 1 ; i--) {
rand = Math.floor(Math.random() * i) + 1;
temp = nums[i];
nums[i] = nums[rand];
nums[rand] = temp;
}
循环中的最后三行交换数组中的两个项目.它将一个项目的值存储起来,将另一个项目中的值复制到第一个项目中,然后将存储的值存储在另一个项目中.
(对于某些项目,i和rand的值实际上可以相同,因此项目与自身交换.这就是算法应该如何工作,它确保项目有相同的机会停留在同一个地方作为被移动到任何其他地方的机会.)
But why not just do something like [code] along with a test to ensure
the random numbers weren’t the same?
这是创建随机数的另一种方法.它会更有效,至少在大多数时候(它理论上可以永远循环),但它的代码数量大致相同.
另一个解决方案是将所有数字放在一个数组中,然后从中随机选择数字并将它们移动到另一个数组.这与改组算法的原理相同,但它只需要进行足够的混洗以使前六个项目在正确的位置(或者使用Fisher-Yates算法的最后六个项目).但是,从数组中删除项目通常是一项昂贵的操作,因为需要将项目转移到其位置之后.
内容总结
以上是互联网集市为您收集整理的javascript中的“彩票” – 排序算法?全部内容,希望文章能够帮你解决javascript中的“彩票” – 排序算法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。