for loop, Math.random() 不按预期运行
for loop, Math.random() not acting as intended
我正在尝试用javascript编写一个骰子游戏,使用Math.random()生成骰子的值和一个数组来保存每个骰子的当前值。
我遇到的问题是 1),数组最终包含六个数字,循环只运行五次,2) 我不知道如何让 Math.random() 在每次掷骰子时返回不同的数字。
这是有问题的函数:
var array = []
function rollDice() {
for (var i = 0; i <= 4; i++) {
var roll = Math.floor(Math.random() * 6) + 1;
array[i] = roll;
//array.splice(i, 1, roll);
}
}
您可以看到"i"在循环中从零迭代到四(等于五个循环),并且在每个循环中生成另一个随机数并将其插入到数组的等效位置。
关于数组中的项目数:如果我按照上面写的代码运行,我会得到这样的结果:[1, 2, 3, 4, 5, undefined]。如果我使用带有"splice"函数的注释行运行它(它应该删除存储在位置"i"的值并将其替换为新值),我会得到 [1, 2, 3, 4, 5, 6]。如果循环只运行五次,这是怎么回事?
至于我让随机数更可靠地更改的困难:我已经在我的循环中尝试了以下内容......
var roll;
while (roll === hand[i] || roll === null) {
roll = Math.floor(Math.random() * 6) + 1;
}
。希望"掷"会继续旋转随机数,直到它想出一个不同的数字,但没有骰子。有人有什么建议吗?
编辑:我添加了一个显式数组声明,因为我没有足够清楚地表明我的数组实际上是显式声明的。
我让它按照你的意图工作。
代码中的错误:
- 您错误地使用了
while
循环。
array
未定义undefined
变量的属性。以下是使用for
修订的代码:
function rollDice() {
for (var i = 0, array = []; i <= 4; i++)
{
array[array.length] = Math.floor(Math.random() * 6) + 1;
}
return array;
}
变化:
- 删除了无用的
roll
变量。 - 使用属性
length
设置下一个位置(类似于array.push(value)
但更快)。 - 宣布
array
- 返回要在函数外部分配的值
使用 do ... while
循环:
function rollDice() {
var array = [];
do
{
array[array.length] = Math.floor(Math.random() * 6) + 1;
}
while ( array.length < 5 );
return array;
}
差异:
- 不再需要
- 变量
i
。 - 直接申报和增加
array.length
- 你只检查最后的长度,这少了一个无用的检查
- 它更快!!
关于(琐碎的)编辑:
别这样!!!
不要访问在函数外部声明的变量。
这是最容易出错的方法!
要随机返回 1 到 5 之间的 5 个唯一数字:
var array = [1,2,3,4,5]
function rollDice() {
array.sort(function(){
return Math.random() - 0.5;
});
}
小提琴:http://jsfiddle.net/1wrgrr0v/1/
既然您已经阐明了您想要的是对roll()
的连续调用不会重复数组中该特定插槽中的值,您可以这样做:
function rollDice() {
var roll;
for (var i = 0; i <= 4; i++) {
// keep generate a new random value until it is different
// than what was in this slot of the array before
while ((roll = Math.floor(Math.random() * 6) + 1) === array[i]) {}
array[i] = roll;
}
}
工作演示:http://jsfiddle.net/jfriend00/frh3dyvd/
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- 使用压缩的JavaScript文件(不是运行时压缩)
- Javascript运行php文件,然后下载文件
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Angularjs代码未在匿名函数中运行
- jquery设置为使用参数运行
- 如何根据时间运行不同的脚本
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- 将文本框链接到由按钮运行的javascript公式
- 为什么不是't运行此Javascript的Chrome
- ng应用程序使脚本无限运行
- 如何在运行时在angular 2中加载外部js脚本
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- JavaScript错误:Microsoft JScript运行时错误:应为对象
- 在终端中运行 JavaScript 时(使用 rhino),如何使用 print() 函数在一行中打印
- for loop, Math.random() 不按预期运行
- Javascript setInterval for game draw loop未一致运行
- Jquery Ajax Call In For Loop只运行一次-可能存在Timing&退出条件
- 我可以以60fps的速度运行angular's digest loop来显示快速计时器吗?