Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/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,我正在创建一个随机数生成器。我知道数字,但有时会重复。这是我的密码 var myRandom function randomNumGen(max, min) { var randomNum = []; for (var i = 0; i < 6; i++) { randomNum[i] = Math.random() * (max - min +1) + min ; randomNum[i] = Math.round(randomNum[i]); } return ra

我正在创建一个随机数生成器。我知道数字,但有时会重复。这是我的密码

var myRandom

function randomNumGen(max, min) {
var randomNum = [];

for (var i = 0; i < 6; i++) {
    randomNum[i] = Math.random() * (max - min +1) + min ;
    randomNum[i] = Math.round(randomNum[i]);
}
return randomNum;
}
myRandom = randomNumGen(1, 53);
console.log(" Here are your numbers." + myRandom);
var myRandom
函数随机数(最大值、最小值){
var randomNum=[];
对于(变量i=0;i<6;i++){
randomNum[i]=Math.random()*(max-min+1)+min;
randomNum[i]=Math.round(randomNum[i]);
}
返回随机数;
}
myRandom=randomNumGen(1,53);
log(“这是你的号码。”+myRandom);

为了使数字不重复,我遗漏了什么?

我认为实现这一点的方法是根据数组中已有的数字检查生成的每个随机数。如果有一个数字重复出现,您将生成另一个随机数并再次检查,依此类推,直到找到一个唯一的数字。

避免重复的第一种方法是在生成新数字时存储所有找到的数字,并丢弃任何已生成的数字。可以使用在数组中搜索数字。只需在for循环的末尾添加以下内容:

if(randomNum.indexOf(randomNum[i]) < i) --i;
if(randomNum.indexOf(randomNum[i])
如果该数字已经在数组中,它将基本上为同一数组单元格再次运行循环。这种方法有一个危险:如果您传入的最小值和最大值不超过6个可能的结果,它将导致无限循环

另一种方法是首先生成所有可能的数字,然后从列表中选择一些,然后删除它们。老实说,当你有一个小范围的值和许多数字要选择,而你有一个非常小的值要选择时,这个解决方案更合适


另外,不要使用
math.round
,因为它为边缘情况提供了不等的机会。例如,对于0到之间的任意随机值,0到2之间的随机数将四舍五入为0,可能类似于:

function range(start, stop) {
  var array = [];

  for (var i = start; i <= stop; i += 1) {
     array.push(i);
  }

  return array; 
}

var nums = range(1, 53).sort(function () { 
   return (Math.random() < 0.5) ? 1 : -1; 
}).slice(0, 6);
功能范围(启动、停止){
var数组=[];

对于(var i=start;i一种方法是构建一个“taked numbers数组”,并检查该数组是否与生成的随机数匹配。如果它不存在,请继续添加它

var takenNumbers = [];
$('#btnGo').on('click', function () {
    var theRandomNumbersArray = randomNumGen(50, 0);
});

function randomNumGen(max, min) {
    var counter = 0;
    var returnArray = [];
    while (counter < 6) {
        var randomNumber = Math.random() * (max - min + 1) + min;
        var randomNumberRounded = Math.round(randomNumber);

        if (takenNumbers.indexOf(randomNumberRounded.toString()) == -1) {
            takenNumbers.push(randomNumberRounded);
            returnArray.push(randomNumberRounded);
            counter += 1;
        }
    }
    return returnArray;
}
var takenNumbers=[];
$('#btnGo')。在('click',函数(){
var theRandomNumbersArray=RandomGen(50,0);
});
函数随机数(最大值、最小值){
var计数器=0;
var returnArray=[];
while(计数器<6){
var randomNumber=Math.random()*(max-min+1)+min;
var randomNumberRounded=数学四舍五入(randomNumber);
if(takenNumbers.indexOf(randomNumberRounded.toString())=-1){
按TakenNumber.push(随机数箭头所示);
returnArray.push(randomNumberRounded);
计数器+=1;
}
}
返回数组;
}

注意:这里有一个你需要考虑的错误。如果使用
while
循环,如果所有的数字都被取下,它可能会衍生成一个无限循环。你可能还需要检查数组是否有一个最大数字的长度或影响它的东西。

你需要存储已经“取下”的数字(可能在阵列中)。然后,当你生成随机数时,只需检查数组或所取的数字。如果它找到一个,则重新生成。如果它很小,则生成一个包含可能值的数组。无序移动并弹出。如果范围很大,则不太好,如果是,则搅拌一个映射/一组使用过的数字。你能给我一个示例吗?我对这方面非常陌生。感谢更好地存储数字在集合或邮件中添加BER,这样您就不必迭代或搜索“take”array.Map.Autocomplete使一切都变得简单。这将在大范围内执行,留下的可用数字很少,因为在找到未使用的数字之前,您可能必须生成许多随机数。您还可以预先随机数组,可能使用类似的方法,并只需按顺序读取结果数组。概念上类似于r到从一副混乱的扑克牌中抽牌。代码-只有答案不是很好。你应该解释为什么你的解决方案解决了OP的问题。@RobG补充了一个解释。我认为解决方案足够简单,可以不言自明。