Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中两个限制之间的随机非重复数字生成_Javascript - Fatal编程技术网

javascript中两个限制之间的随机非重复数字生成

javascript中两个限制之间的随机非重复数字生成,javascript,Javascript,除了数组拼接之外,还有什么方法可以用来在两个数字之间生成一个随机数,而无需重复,直到生成这两个数字之间的所有数字为止?洗牌技术或除拼接之外的任何其他数组方法都非常有用。首先,我们使用fisherYates实现,并扩展数组原型以提供洗牌功能 function arrayShuffle () { var i = this.length, j, temp; if ( i === 0 ) return false; while ( --i ) { j = Math.floo

除了数组拼接之外,还有什么方法可以用来在两个数字之间生成一个随机数,而无需重复,直到生成这两个数字之间的所有数字为止?洗牌技术或除拼接之外的任何其他数组方法都非常有用。

首先,我们使用fisherYates实现,并扩展数组原型以提供洗牌功能

function arrayShuffle () {
   var i = this.length, j, temp;
   if ( i === 0 ) return false;
   while ( --i ) {
      j = Math.floor( Math.random() * ( i + 1 ) );
      temp = this[i];
      this[i] = this[j]; 
      this[j] = temp;
   }
}

Array.prototype.shuffle =arrayShuffle;

var numbers = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.shuffle();
现在使用
pop
方法,我们从种子中获取一个数字,直到它为空

numbers.pop(); //returns a number
为了确保数组中填充了
start
end
范围内的数字,我们使用一个简单的循环来创建种子

var start = 1;
var end = 5;
var numbers = new Array();
for (var i = start; i <= end; i++) {
    numbers.push(i);
}
var start=1;
var-end=5;
变量编号=新数组();
对于(var i=start;i尝试以下方法:

功能范围(最小值、最大值){
var结果=[];

对于(var i=min;i处理较小数组时,我通常会按随机顺序对数组进行排序:

yourArray.sort(function() { return 0.5 - Math.random() });

Fisher Yates shuffle:这是一个糟糕的(不统一的)规则混洗算法。若要看它不能是一个均匀的混洗,只需考虑<代码> n**n/c>同样可能的混洗,而排列的数量<<代码> n>代码>元素是“代码> n!< /代码>,而一般的代码> n**n>代码>不是精确的倍数<代码> n!< /代码>。这不是正确的洗牌方式。更新Fisher-Yates shuffle。您只能在列表的后面对每个成员进行洗牌。这样您可以得到n!可能的排列,这是正确的数字,可以精确地对每个成员进行一次洗牌。亲爱的上帝,这不应该是一个学术解决方案。但看在上帝的份上,我提出了一个更有效的洗牌算法:)@MatthaisLaug您的洗牌算法不正确。如中所示,它是有偏差的。如中所示,它没有同等频率地选择所有洗牌。这就是我们所抱怨的,因为缺乏正确性非常糟糕:)fisterYates
是一种生成有限集合的随机置换的算法,用于对集合进行随机洗牌
,但在所有置换出现之前,可能会再次得到相同的置换。如果要避免这种情况,需要为洗牌方法提供一个数组来检查新的洗牌数组是否尚未使用
yourArray.sort(function() { return 0.5 - Math.random() });