【发布时间】:2010-09-26 06:12:20
【问题描述】:
我需要帮助来编写一些代码,该代码将从 12 个数字的数组中创建一个随机数并打印 9 次而不会被欺骗。这对我来说很难完成。有什么想法吗?
【问题讨论】:
标签: javascript random
我需要帮助来编写一些代码,该代码将从 12 个数字的数组中创建一个随机数并打印 9 次而不会被欺骗。这对我来说很难完成。有什么想法吗?
【问题讨论】:
标签: javascript random
var nums = [1,2,3,4,5,6,7,8,9,10,11,12];
var gen_nums = [];
function in_array(array, el) {
for(var i = 0 ; i < array.length; i++)
if(array[i] == el) return true;
return false;
}
function get_rand(array) {
var rand = array[Math.floor(Math.random()*array.length)];
if(!in_array(gen_nums, rand)) {
gen_nums.push(rand);
return rand;
}
return get_rand(array);
}
for(var i = 0; i < 9; i++) {
document.write(get_rand(nums));
}
【讨论】:
执行此操作的最有效和最有效的方法是将您的号码随机排列,然后打印前九个号码。使用good shuffle algorithm。Thilo 的建议会给你带来糟糕的结果。 See here.
编辑 下面是一个简短的 Knuth Shuffle 算法示例:
void shuffle(vector<int> nums)
{
for (int i = nums.size()-1; i >= 0; i--)
{
// this line is really shorthand, but gets the point across, I hope.
swap(nums[i],nums[rand()%i]);
}
}
【讨论】:
试试这个:
//Here o is the array;
var testArr = [6, 7, 12, 15, 17, 20, 21];
shuffle = function(o){ //v1.0
for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
shuffle(testArr);
【讨论】:
这做起来相对简单,其原理是创建另一个数组来跟踪您使用了数组的哪些元素。
var tempArray = new Array(12),i,r;
for (i=0;i<9;i++)
{
r = Math.floor(Math.random()*12); // Get a random index
if (tempArray[r] === undefined) // If the index hasn't been used yet
{
document.write(numberArray[r]); // Display it
tempArray[r] = true; // Flag it as have been used
}
else // Otherwise
{
i--; // Try again
}
}
其他方法包括改组数组、从数组中删除使用的元素或将使用的元素移动到数组的末尾。
【讨论】:
如果我理解正确的话,你想重新排列你的数组。
循环几次(数组的长度应该这样做),并且在每次迭代中,获取两个随机数组索引并在那里交换两个元素。 (更新:如果你真的很认真,这可能不是best algorithm)。
然后您可以打印前九个数组元素,它们将按随机顺序排列,不会重复。
【讨论】:
这是一种获取 min 和 max 之间不重复随机数的通用方法:
function inArray(arr, el) {
for(var i = 0 ; i < arr.length; i++)
if(arr[i] == el) return true;
return false;
}
function getRandomIntNoDuplicates(min, max, DuplicateArr) {
var RandomInt = Math.floor(Math.random() * (max - min + 1)) + min;
if (DuplicateArr.length > (max-min) ) return false; // break endless recursion
if(!inArray(DuplicateArr, RandomInt)) {
DuplicateArr.push(RandomInt);
return RandomInt;
}
return getRandomIntNoDuplicates(min, max, DuplicateArr); //recurse
}
致电:
var duplicates =[];
for (var i = 1; i <= 6 ; i++) {
console.log(getRandomIntNoDuplicates(1,10,duplicates));
}
【讨论】:
const nums = [1,2,3,4,5,6,7,8,9,10,11,12];
for(var i = 1 ; i < 10; i++){
result = nums[Math.floor(Math.random()*nums.length)];
const index = nums.indexOf(result);
nums.splice(index, 1);
console.log(i+' - '+result);
}
【讨论】: