在Array中生成随机数而不重复 - JavaScript

时间:2014-03-19 15:36:15

标签: javascript html arrays random

所以我知道这个任务已被提出,但所有给出的答案都已为我所知。我不想做出所有可能数字的变量(这总是答案)。所以要回答这个问题,我想制作一个随机数生成器,它将生成7个数字,这些数字必须不一样。例如,我得到随机数: “5,16,12,5,21,37,2”......但我不想再使用5号,所以我想要不同的数字。我为这一代制作了一个代码,但我想不出任何好的方法/方法来做到这一点。我想也许可以检查数字是否已经在数组中,如果是,然后生成另一个数字,但由于我是JavaScript的业余爱好者,我不知道如何做到这一点。这是我的JavaScript代码:

// JavaScript文档

function TableOn()
{
    document.write("<table border='1'>");
}
function TableOff()
{
    document.write("</table>");
}

function RandNum()
{
    var n = new Array();
    for(var i=0;i<7;i++)
    {
        n[i] = Math.round((1+(Math.random()*40)));
    }
    TableOn();
    for(var c=0;c<7;c=c+1)
    {
        document.write("<tr><td>"+n[c]+"</td></tr>");
    }
    TableOff();
}

在HTML中,我只有一个按钮,即onclick="RandNum()" ...请原谅我的英语。

6 个答案:

答案 0 :(得分:1)

我会这样做:

var nums = [], numsLen = 5, maxNum = 100, num;
while (nums.length < numsLen) {
    num = Math.round(Math.random() * maxNum);
    if (nums.indexOf(num) === -1) {
        nums.push(num);
    }
}

这将生成一个包含5个随机数的数组,范围为0..100。 (numsLen不能大于maxNum。)

答案 1 :(得分:0)

这些命令可用于检查数组中是否有值:

if ( !!~n.indexOf(someVal) ) {
    // someVal is in array "n"
}
if ( !~n.indexOf(someVal) ) {
    // someVal is not in array "n"
}

答案 2 :(得分:0)

    var n = new Array(),num;
function TableOn()
{
    document.write("<table border='1'>");
}
function TableOff()
{
    document.write("</table>");
}
function check_repition()
{
num=Math.round((1+(Math.random()*40)))
if(n.indexOf(num)==-1)
return true;
else 
return false;
}

 function RandNum()
    {

        for(var i=0;i<7;i++)
        {
if(check_repition())
            n[i] =num;
else // keep checking
{
    check_repition()
     n[i] =num;
}
        }
        TableOn();
        for(var c=0;c<7;c=c+1)
        {
            document.write("<tr><td>"+n[c]+"</td></tr>");
        }
        TableOff();
    }
    RandNum()

答案 3 :(得分:0)

我使用一个字符串,用分隔符存储生成的随机数。然后检查新生成的数字是否在该字符串中。

像这样的东西

generated = "";
for(var i=0;i<7;i++)
{
    generate = Math.round((1+(Math.random()*40))); //generate = 5
    while (generated.indexOf("[" + generate + "]") != -1) { //checking if the [5] is already in the generated string, and loop until it's a different number
        generate = Math.round((1+(Math.random()*40))); //get a new random number
    }
    generated += "[" + generate + "]";
    n[i] = generate;
}

或者你可以采取另一种更长的方法

for(var i=0;i<7;i++)
{
    repeated = true;
    while (repeated) { 
        repeated = false;
        generate = Math.round((1+(Math.random()*40)));
        for (var a=0; a < i, a++) {
            if (generate == n[a]) { repeated = true; }
        }
    }
    n[i] = generate;
}

答案 4 :(得分:0)

不确定是否真的需要OP的非重复要求,但如果你的数字范围不是太大,这里可以解决一些问题:

http://jsfiddle.net/6rEDV/1/

function range(start, end, step) {
    if (typeof step === 'undefined') {
        step = 1;
    }

    if (typeof start === 'undefined' || typeof end === 'undefined') {
        throw TypeError('Must have start and end');
    }

    var ret = [];
    for (var i = start; i <= end; i += step) {
        ret.push(i);
    }

    return ret;
};

// source: http://stackoverflow.com/a/6274381/520857
function shuffle(o) { //v1.0
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};

function getNonRepeatingRand(min, max, num) {
    var arr = shuffle(range(min, max));
    return arr.slice(0, num-1);
}

// Get 7 random numbers between and including 1 and 1000 that will *not* repeat
console.log(getNonRepeatingRand(1,1000,7));

可能更慢但内存更少的方法:

http://jsfiddle.net/Qnd8Q/

function rand(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getNonRepeatingRand(min, max, num) {
    var ret = [];

    for (var i = 0; i < num; i++) {
        var n = rand(min, max);
        if (ret.indexOf(n) == -1) {
            ret.push(n);
        } else {
            i--;
        }
    }
    return ret;
}

console.log(getNonRepeatingRand(1,5,5));

答案 5 :(得分:0)

这是一个在[min, max)中生成 n 重复随机数的数组的函数:

function rands(n, min, max) {
  var range = max - min;
  if (range < n)
    throw new RangeError("Specified number range smaller than count requested");

  function shuffle() {
    var deck = [], p, t;
    for (var i = 0; i < range; ++i)
      deck[i] = i + min;

    for (i = range - 1; i > 0; --i) {
      p = Math.floor(Math.random() * i);
      t = deck[i];
      deck[i] = deck[p];
      deck[p] = t;
    }
    return deck.slice(0, n);
  }

  function find() {
    var used = {}, rv = [], r;
    while (rv.length < n) {
      r = Math.floor(Math.random() * range + min);
      if (!used[r]) {
        used[r] = true;
        rv.push(r);
      }
    }
    return rv;
  }

  return range < 3 * n ? shuffle() : find();
}

此代码检查可能值的范围,并将其与请求的随机值数进行比较。如果范围小于请求的值的三倍,则代码使用shuffle来避免查找方法的可怕性能。但是,如果范围很大,则使用查找方法。