我需要帮助编写一些代码,它将从12个数字组成的数组中创建一个随机数,然后在没有模糊的情况下打印它9次。这对我来说很难完成。有任何想法吗?在Javascript中没有使用随机数字生成器?
回答
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));
}
如果我正确理解你,你想洗牌你的数组。
循环几次(数组的长度应该这样做),并且在每次迭代中,获得两个随机数组索引并在那里交换两个元素。 (更新:如果你对此非常认真,这可能不是best algorithm)。
然后,您可以打印前九个数组元素,它们将以随机顺序排列,不再重复。
这样做相对简单,它背后的理论是创建另一个数组,用于跟踪您使用的数组中的哪些元素。
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
}
}
其它方法包括洗牌阵列,从数组中取出使用的元件,或移动使用的元件的阵列的端部。
尽管不要使用上面的代码,但它是一个非常简单的例子,用于演示你正在尝试做的背后的逻辑(从12个值的数组中打印9个值以随机顺序)。 – 2010-09-26 06:40:25
尽管它似乎产生了一个无偏差的数字序列。我能看到的唯一问题是性能,因为越来越难找到剩余的数字。 – Thilo 2010-09-26 07:02:43
准确地说,虽然该算法对于较小的数据集足够了,但对于较大的集合,您需要确保不会发生冲突,无论是通过从阵列中删除数据还是将其推到最后。 – 2010-09-26 07:15:13
尝试这一次,
//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);
做到这一点的最有效和最有效的方法是洗你的号码,然后打印他们的前九。使用good shuffle algorithm。Thilo建议的结果会给你带来不好的结果。 See here.
编辑 这里有一个简短的Knuth的随机算法例如:
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]);
}
}
如果你认真对待它,使用你所建议的经过验证的算法看起来好像更好。我只想指出,我提出的算法并不是在“see here”中讨论的算法。 – Thilo 2010-09-26 06:58:12
这是不相同的算法,没有。但是我担心,如果我理解正确,它仍然会产生同样的错误。你的算法会有n^3个结果落入n中!框。这不能给予均匀的分配。用你的算法尝试文章中的实验,看看它是否有效。 – JoshD 2010-09-26 07:06:07
在对您链接的博客的评论中,“我的”算法由“fabio”提出。他声称它可以工作,但交换次数更多(不仅仅是数组大小)。我会再读一遍,看看我能证明它是对还是错。尽管它有性能问题,但Andrew Dunn的提议似乎在统计上也是正确的。 – Thilo 2010-09-26 07:20:06
这里是获得的最小值和最大值之间的随机数没有重复的通用方法:
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));
}
- 1. 使用javascript随机生成数字
- 2. 随机数字生成器Javascript - 范围
- 3. 在随机生成50个随机数中使用随机数#
- 4. 有没有可能使用XQuery生成随机数字?
- 5. 随机在numpy中没有生成随机数
- 6. Javascript随机生成器
- 7. 如何生成没有重复的随机数字javascript
- 8. 在随机生成器中使用NSMutableArray
- 9. 在JavaScript中生成多个随机数
- 10. 在JavaScript中生成一个随机数
- 11. 生成没有统一的随机数发生器的高斯随机数
- 12. 如何在Swift中生成没有重复的随机数字?
- 13. 在iPhone中生成没有重复的随机数字?
- 14. JavaScript随机数学乘法生成器
- 15. 在数组中生成随机数字
- 16. 随机字生成器python
- 17. 随机字生成器#2
- 18. 使用R随机生成数字
- 19. 使用随机数生成器Java
- 20. Javascript随机生成
- 21. 使用sed在随机数行中生成随机数
- 22. 生成随机数对,没有重复
- 23. 随机数生成没有重复
- 24. 生成没有循环的随机数
- 25. 生成没有零的随机数
- 26. 生成没有重复的随机数
- 27. JavaScript中的随机对象生成器
- 28. 随机数生成器帮助不生成随机数 - C
- 29. HTML或Javascript中的随机数字生成器
- 30. 在php中生成随机数字
你也可以赞成答案:) – 2010-09-27 05:33:38