JS中的基本级别非重复随机

时间:2019-06-06 11:56:01

标签: javascript random

我正在尝试进行测验,我需要5个随机问题,以使其起作用,我创建了随机变量(rnd-rnd5),因为我需要在两个函数中使用这些变量。我需要制作非重复变量,但是下面的解决方案不起作用。如果可能的话,我需要“基本的”解决方案,因为我们的老师希望我们拥有一个“与我们同等水平”的代码。

var rnd = [Math.floor(Math.random() * 29) + 0];
var rnd2 = [Math.floor(Math.random() * 29) + 0];
while (rnd2 !== rnd){
    rnd2 = Math.floor(Math.random() * 29) + 0;
}

var rnd3 = [Math.floor(Math.random() * 29) + 0];
while (rnd3 !== rnd && rnd3 !== rnd2){
    rnd3 = Math.floor(Math.random() * 29) + 0;
}

var rnd4 = [Math.floor(Math.random() * 29) + 0];
while (rnd4 !== rnd && rnd4 !== rnd2 && rnd4 !== rnd3){
    rnd4 = Math.floor(Math.random() * 29) + 0;
}
var rnd5 = [Math.floor(Math.random() * 29) + 0];
while (rnd5 !== rnd && rnd5 !== rnd2 && rnd5 !== rnd3 && rnd5 !== rnd4){
    rnd5 = Math.floor(Math.random() * 29) + 0;
}

2 个答案:

答案 0 :(得分:0)

您遇到了一些问题:

  1. 您正在生成具有单个成员(随机数)的 array 。数组always not equal与其他数组以及除其自身以外的其他任何值。看起来好像您想要一个普通变量,因此只需要删除[调用周围的]Math.floor

  2. 您还可以进行向后检查-如果当前编号与旧编号不等于,则您正在生成新编号。这意味着您将一直生成,直到两者相同为止。您只需要执行相反的检查===

  3. 您正在使用AND &&进行检查,其中您需要使用OR进行检查,以查找先前数字中的任何是否匹配。

    < / li>

这将产生工作代码:

var rnd = Math.floor(Math.random() * 29) + 0;
var rnd2 = Math.floor(Math.random() * 29) + 0;
while (rnd2 === rnd){
    rnd2 = Math.floor(Math.random() * 29) + 0;
}

var rnd3 = Math.floor(Math.random() * 29) + 0;
while (rnd3 === rnd || rnd3 === rnd2){
    rnd3 = Math.floor(Math.random() * 29) + 0;
}

var rnd4 = Math.floor(Math.random() * 29) + 0;
while (rnd4 === rnd || rnd4 === rnd2 || rnd4 === rnd3){
    rnd4 = Math.floor(Math.random() * 29) + 0;
}
var rnd5 = Math.floor(Math.random() * 29) + 0;
while (rnd5 === rnd || rnd5 === rnd2 || rnd5 === rnd3 || rnd5 === rnd4){
    rnd5 = Math.floor(Math.random() * 29) + 0;
}

console.log(rnd, rnd2, rnd3, rnd4, rnd5)

话虽如此,如果您generate non-random numbers first, then jumble them and pick however many you need,则可以更轻松地生成随机的非重复数字。

答案 1 :(得分:0)

创建数字数组

var numbers = [];
for(var i=0; i<30; ++i) numbers.push(i);

通过从0到29(i)随机排列数字,在每个循环中选择一个随机数0-29(j)并交换索引i,j的值。

for(var i=0; i<30; ++i) {
  var j = Math.floor(Math.random()*30);
  var tmp = numbers[i];
  numbers[i] = numbers[j];
  numbers[j] = tmp;
}

前n个数字(5)是随机且唯一的:

for(var i=0; i<5; ++i) {
  console.log(numbers[i]);
}