【问题标题】:What is the best way to randomly pick numbers from 1 to 10 without repeating one?从 1 到 10 随机选择数字而不重复一个的最佳方法是什么?
【发布时间】:2014-02-20 09:41:18
【问题描述】:

有没有一种有效的方法可以将整数解包为随机的唯一数字?

我希望 10 变成 3 4 6 1 0 2 5 7 8 9

我尝试了THIS ...但在将值推入数组并疯狂循环之前,我想也许有更好的方法。

编辑:

这是我的新 FIDDLE 和功能:

function uniqueDigits(x){
    y = [];
    z = [];
    while(x > 0) {    
        y.push(x);
        x--;
    } 
    while(y.length > 0){
        var r = Math.floor(Math.random()*y.length);
        var u = y[r]
        y.splice(r, 1);
        z.push(u-1);
    }         
    return z;
}

uniqueDigits(4) //['2', '3', '0', '1']

编辑:

这是另一个OPTION

function uniqueNum(x){
  z = y = x;
  var r = Math.ceil(Math.random() * x);

  while ( x%r%2 == 0 ) {
    r = Math.ceil(Math.random() * x);
  }

  while( x>0 ){
    y = y - r     
    if(y<0){ 
      var n = y; 
      y = z + n 
    }   
    $('p').append(y);
    x--
   }    
} uniqueNum(4);//['2', '3', '0', '1']

THIS 也是一个

好的,我已经完成了。

【问题讨论】:

  • @WesleyMurch 它不是第一个的副本。输出不能重复
  • 它也不是另一个的重复,看这重复相同的整数:jsfiddle.net/ecLHN
  • @Squirrl,您是否在 jsfiddle 中反复按“运行”?如果是,那么它当然可以重复,但代码没有错:-)
  • @Squirrl 虽然您的解决方案可以从链接的帖子中得出,但我认为您的问题足够独特,可以提供量身定制的答案并已投票重新开放(仅供参考,目前有 2 个重新开放投票)。很抱歉这么快就投票结束了。
  • 用于伪随机数组(不是真正随机的):var pseudoRandomArray = Array.apply(null, { length: 10 }).map(Number.call, Number).sort(function() { return Math.random() &gt; Math.random(); });

标签: javascript jquery


【解决方案1】:

由于您要查找范围内的所有数字,请尝试

var x = 10,
    array = [];
for (var y = 0; y < x; y++) {
    array.push(y);
}
while (array.length) {
    var random = Math.floor(Math.random() * array.length);
    $('p').append(array.splice(random, 1));
}

演示:Fiddle


使用数组的另一种方式是

var x = 10,
    array = [];
//used for counting the loop for performance testing - remove it
var counter = 0;
for (var y = 0; y < x;) {
    var random = Math.floor(Math.random() * x);
    if ($.inArray(random, array) == -1) {
        $('p').append(random);
        array.push(random);
        y++;        
    }
    //for test
    counter++;
}
console.log(counter)

演示:Fiddle - 但循环执行次数过多

【讨论】:

  • @Arun 哇,我得出了你几个小时前给我的同样结论。哈哈谢谢。
【解决方案2】:

为了更高效,我会写下范围,然后像使用

一样随机播放

事实上的无偏洗牌算法是 Fisher-Yates(又名 Knuth) 随机播放。

来自How to randomize (shuffle) a javascript array? 的回答。

原来是这样:

var x = 10;
var range = [];
for (var y = 0; y < x; y++) {
    range.push(y);
}
function shuffle(array) {
  var currentIndex = array.length
    , temporaryValue
    , randomIndex
    ;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
}
shuffle(range);

【讨论】:

    【解决方案3】:

    我会这样做:

    function getRandomNonRepeatedInt(limit)
    {
        var array = [], result = "";
        for (var y = 0; y <= limit-1; array.push(y), y++);
        while (array.length) result = result + array.splice(Math.floor(Math.random() * array.length), 1)[0];
        return result;
    }
    

    抱歉混淆了... :-)

    Fiddle

    【讨论】:

      猜你喜欢
      • 2017-12-16
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2014-05-05
      • 1970-01-01
      • 2021-04-27
      相关资源
      最近更新 更多