【问题标题】:Unique in generated random number (no duplicate)在生成的随机数中唯一(无重复)
【发布时间】:2016-05-24 15:52:42
【问题描述】:

我只希望生成的随机数没有重复,每当我尝试输入数字时,生成的随机数有重复,任何其他想法。我应该在这里改变什么?

See the fiddle

var arr = hello.toString(10).replace(/\D/g, '0').split('').map(Number);
for(i=0;i<arr.length;i++) arr[i] = +arr[i]|0;

//initialize variables 
var z = arr[3]; 
var y = arr[2];
var x = arr[1];
var w = arr[0];

while((((a2 <= 0) || (a2 > 49)) || ((b <= 0) || (b > 49)) || ((c <= 0) || (c > 49)) || ((d <= 0) || (d > 49)) || ((e2 <= 0) || (e2 > 49)) || ((f <= 0) || (f > 49)) || ((g <= 0) || (g > 49)  ))){

    //loop ulit kapag hindi match yung random number sa value nung z
    while( zRandomString != z){     
         zRandom = Math.floor(Math.random() * (109 - 100 + 1)) + 100;
         zRandomRound = zRandom % 10;
         zRandomString = zRandomRound.toString();
    }
    var zNew = zRandom; //new value ng z
    document.getElementById("zebra").innerHTML = "Z = " + zNew + "<br />";// udsadsadsad

    h = zNew;

    while( yRandomString != y){     
         yRandom = Math.floor(Math.random() * (49 - 1 + 1)) + 1;
         yRandomRound = yRandom % 10;
         yRandomString = yRandomRound.toString();
    }
    var yNew = yRandom; //new value ng z
    document.getElementById("yeah").innerHTML = "Y = " + yNew + "<br />";// udsadsadsad

    h = h - yNew;

    while( xRandomString != x){     
         xRandom = Math.floor(Math.random() * (h - 1 + 1)) + 1;
         xRandomRound = xRandom % 10;
         xRandomString = xRandomRound.toString();
    }
    var xNew = xRandom; //new value ng z
    document.getElementById("ex").innerHTML = "X = " + xNew + "<br />";// udsadsadsad

    h = h - xNew;

    while( wRandomString != w){
        wRandom = Math.floor(Math.random() * (h - 1 + 1)) + 1;
        wRandomRound = wRandom % 10;
        wRandomString = wRandomRound.toString();
    }
    var wNew = wRandom; //new value ng z
    document.getElementById("weh").innerHTML = "W = " + wNew + "<br />";// udsadsadsad

    //h = Math.abs(h - wNew); // new value of h
    h = h - wNew;           

    a = Math.floor(Math.random() * (wNew - 1 + 1)) + 1;
    a2 = wNew - a;
    b = Math.floor(Math.random() * (a2 - 1 + 1)) + 1;   
    c = a - b;  
    d = yNew;
    e = Math.floor(Math.random() * (xNew - 1 + 1)) + 1;
    e2 = xNew - e;
    f = Math.floor(Math.random() * (e2 - 1 + 1)) + 1;
    g = e - f;      
}
var combo = a2.toString() + ', ' + b.toString() + ', ' + c.toString() + ', ' + d.toString() + ', ' + e2.toString() + ', ' + f.toString() + ', ' + g.toString() + ', ' + h.toString();
document.getElementById("combo").innerHTML = combo;

【问题讨论】:

  • 为什么循环while( zRandomString != z)?当您最终希望它等于z 时,将zRandomString 随机化是没有意义的。这没有意义。
  • 您是否正在尝试做类似的事情:stackoverflow.com/questions/105034/…
  • 计算的结果,将是唯一的,没有重复。上面的小提琴,可以帮忙吗?知道我应该在这里使用什么|?
  • 不清楚你到底想要什么,即使是小提琴,这似乎对我不起作用。您想创建最多十个不重复的随机数吗?

标签: javascript regex algorithm random numbers


【解决方案1】:

不清楚你想要什么,但是创建一个基于唯一随机数的序列的一种方法是创建一个数字池,然后依次从中挑选和删除项目:

function pick(pool) {
    if (pool.length == 0) return undefined;

    // pick an element from the pool
    var k = (Math.random() * pool.length) | 0;
    var res = pool[k];

    // adjust array
    pool[k] = pool[pool.length - 1];
    pool.pop();

    return res;
}

// example    
var pool = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

while (pool.length) {
    console.log(pick(pool));
}

另一种方法是先洗牌池,然后弹出元素:

function shuffle(arr) {
    var n = arr.length;

    while (n) {
        // pick element
        var k = (Math.random() * n--) | 0;

        // swap last and picked elements
        var swap = arr[k];
        arr[k] = arr[n];
        arr[n] = swap;
    }
}

var pool = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

shuffle(pool);

while (pool.length) {
    console.log(pool.pop());
}

如果您查看pickshuffle 函数,这两种方法并没有太大区别。当然,最终你会耗尽池。然后,您可以决定重新创建或重新排列阵列。另请注意,如果池中有重复条目,这些方法将产生重复元素。

【讨论】:

  • 先生,因为我有计算,我不知道为什么我的小提琴不能工作,无论如何。结果不会创建重复的随机数
  • postimg.org/image/8zjlg2rsp 这是我的 PS,所以,如您所见,生成的计算随机数是 8,我希望它不重复.. 8 个数字是参考 a, b,c,d,e,f,g,h /// a+b+c 就是 W (13) /// e+f+g 是 X (52) /// 然后 d = Y (35) /// 和 a+b+c+e+d+f+g+h = Z (101)
  • 我真的不明白你的意思,恐怕。
【解决方案2】:

尝试使用这个方案:

var r;
do {
    r = Math.floor(Math.random() * 10);
} while (r == 6);

【讨论】:

  • 它会返回一个从 0 到 9 的随机数,但是 6。
  • 解决提问者问题以外的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多