好的,所以我需要在1-10之间创建四个随机生成的数字,它们不能相同。所以我的想法是将每个数字添加到数组中,但是如何检查数字是否在数组中,如果是,则重新生成数字,如果不是将新数字添加到数组中?
所以基本上它会去,
1.创建新号码并添加到阵列 2.创建第二个新数字,检查它是否已存在,如果不存在,则添加到数组。如果确实存在,请重新创建新号码,再次检查等... 3.同上,等等。
答案 0 :(得分:9)
你想要一个所谓的“随机抓包”。考虑一下你有一个“袋子”的数字,每个号码只在这个包中代表一次。你可以根据需要随机抽出数字。
这里介绍的一些其他解决方案的问题是它们随机生成数字,并检查它是否已被使用。这将花费更长的时间来完成(理论上可以达到无限的时间)因为你正在等待random()函数返回一个你还没有的值(并且它不会拥有为了做到这一点,它可以永远给你1-9,但永远不会回报10)。
有很多方法可以实现抓包式解决方案,每种解决方案都有不同程度的成本(但是,如果正确完成,将永远不会无限)。
您问题的最基本解决方案如下:
var grabBag = [1,2,3,4,5,6,7,8,9,10];
// randomize order of elements with a sort function that randomly returns -1/0/1
grabBag.sort(function(xx,yy){ return Math.floor(Math.random() * 3) - 1; })
function getNextRandom(){
return grabBag.shift();
};
var originalLength = grabBag.length;
for(var i = 0; i < originalLength .length; i++){
console.log(getNextRandom());
}
这当然对原始的grabBag数组具有破坏性。而且我不确定那种“真正随机”是多少,但对于许多应用来说它可能“足够好”。
稍微不同的方法是将所有未使用的元素存储在数组中,随机选择一个索引,然后删除该索引处的元素。这里的成本是每次删除元素时创建/销毁数组的频率。
答案 1 :(得分:2)
使用数组查看是否已生成该数字。
var randomArr = [], trackingArr = [],
targetCount = 4, currentCount = 0,
min = 1, max = 10,
rnd;
while (currentCount < targetCount) {
rnd = Math.floor(Math.random() * (max - min + 1)) + min;
if (!trackingArr[rnd]) {
trackingArr[rnd] = rnd;
randomArr[currentCount] = rnd;
currentCount += 1;
}
}
alert(randomArr); // Will contain four unique, random numbers between 1 and 10.
答案 2 :(得分:2)
以下是使用Matt的grabBag技术的几个版本:
function getRandoms(numPicks) {
var nums = [1,2,3,4,5,6,7,8,9,10];
var selections = [];
// randomly pick one from the array
for (var i = 0; i < numPicks; i++) {
var index = Math.floor(Math.random() * nums.length);
selections.push(nums[index]);
nums.splice(index, 1);
}
return(selections);
}
你可以在这里看到它:http://jsfiddle.net/jfriend00/b3MF3/。
而且,这是一个允许你传递你想要覆盖的范围的版本:
function getRandoms(numPicks, low, high) {
var len = high - low + 1;
var nums = new Array(len);
var selections = [], i;
// initialize the array
for (i = 0; i < len; i++) {
nums[i] = i + low;
}
// randomly pick one from the array
for (var i = 0; i < numPicks; i++) {
var index = Math.floor(Math.random() * nums.length);
selections.push(nums[index]);
nums.splice(index, 1);
}
return(selections);
}
答案 3 :(得分:1)
var a = [];
for (var i = 0; i < 5; i++) {
var r = Math.floor(Math.random()*10) + 1;
if(!(r in a))
a.push(r);
else
i--;
}
那会为你做的。不过要小心。如果你生成的随机数大于可能数(10),你将会遇到一个无限循环。
答案 4 :(得分:0)
我正在使用递归函数。测试函数选择1到9之间的6个唯一值。
//test(1, 9, 6);
function test(min, max, nbValue){
var result = recursValue(min, max, nbValue, []);
alert(result);
}
function recursValue(min, max, nbValue, result){
var randomNum = Math.random() * (max-min);
randomNum = Math.round(randomNum) + min;
if(!in_array(randomNum, result)){
result.push(randomNum);
nbValue--;
}
if(nbValue>0){
recursValue(min, max, nbValue, result);
}
return result;
}
function in_array(value, my_array){
for(var i=0;i< my_array.length; i++){
if(my_array[i] == value){
console.log(my_array+" val "+value);
return true;
}
}
return false;
}
答案 5 :(得分:0)
这是一个递归函数,你在寻找什么。
"howMany" parameter is count of how many unique numbers you want to generate.
"randomize" parameter is biggest number that function can generate.
例如:rand(4,8)函数返回一个数字,其中包含4个数字,数字介于0和7之间(因为你知道,Math.random()函数会生成从零到[0]的数字给定数字 - 1])
var array = [];
var isMatch= false;
function rand(howMany, randomize){
if( array.length < howMany){
var r = Math.floor( Math.random() * randomize );
for( var i = 0; i < howMany; i++ ){
if( array[i] !== r ){
isMatch= false;
continue;
} else {
isMatch= true;
break;
}
}
if( isMatch == false ){
array.push(r);
ran(howMany, randomize);
}
ran(howMany, randomize);
return array;
}
}
答案 6 :(得分:0)
答案earlier中确实有一个小错误。代替
var originalLength = grabBag.length;
for(var i = 0; i < originalLength .length; i++){
console.log(getNextRandom());
}
我相信你的意思是:
var originalLength = grabBag.length;
for(var i = 0; i < originalLength; i++){
console.log(getNextRandom());
}
谢谢。