的JavaScript
我尝试过这样的搜索,但我无法找到它。
这是一个简单的想法:
一个。取0到10之间的随机数。
湾假设滚动的随机数为3。
℃。然后,保存号码(3)。
d。现在,在0到10之间再次取一个随机数,但它不能是3,因为它已经出现了。
答案 0 :(得分:14)
一种解决方案是生成一个数组(“存储桶”),其中包含您要选择的所有值,在这种情况下,所有数字都是0到10.然后从数组中随机选取一个并从存储桶中删除它。请注意,下面的示例不会检查存储桶是否为空,因此如果您将此功能调用超过10次,则会出现错误。
var bucket = [];
for (var i=0;i<=10;i++) {
bucket.push(i);
}
function getRandomFromBucket() {
var randomIndex = Math.floor(Math.random()*bucket.length);
return bucket.splice(randomIndex, 1)[0];
}
// will pick a random number between 0 and 10, and can be called 10 times
console.log(getRandomFromBucket());
答案 1 :(得分:1)
Var rnd = getRnd();
while(rnd!= lastRnd) rnd = getRnd();
其中getRnd是一个生成随机数的函数。
实际上,您必须检查当前的随机数是否在数组中......如果您的可能随机数列表很小,请注意无限循环。
答案 2 :(得分:0)
您可以使用以下内容:
/**
* range Get an array of numbers within a range
* @param min {number} Lowest number in array
* @param max {number} Highest number in array
* @param rand {bool} Shuffle array
* @return {array}
*/
range: function( min, max, rand ) {
var arr = ( new Array( ++max - min ) )
.join('.').split('.')
.map(function( v,i ){ return min + i })
return rand
? arr.map(function( v ) { return [ Math.random(), v ] })
.sort().map(function( v ) { return v[ 1 ] })
: arr
}
并像这样使用它:
var arr = range( 1, 10, true )
现在你有一个10个数字,从1到10的数组是随机顺序的,并且从不重复。接下来你可以这样做:
arr.forEach(function( num, i ) {
// do something, it will loop 10 times
// and num will always be a different number
// from 1 to 10
});
答案 3 :(得分:0)
只是为了好玩:派生自@ Strilles回答'桶构造函数'
function RandomBucket(from,until){
min = (Number(from) || 0);
max = (Number(until) || 10)+1;
this.bucket = String(Array(max-min)).split(',').map(function(i){
return min++;
});
if (!RandomBucket.prototype.get){
RandomBucket.prototype.get = function(){
var randomValue =
this.bucket.length < 2
? this.bucket.shift()
: this.bucket.splice(Math.floor(Math.random()*this.bucket.length),1);
return randomValue || 'bucket empty';
};
}
}
有关使用示例,请参阅JsFiddle
答案 4 :(得分:0)
使用d3:
var bucket = d3.shuffle(d3.range(11));
while(bucket.length) {
console.log(bucket.pop());
}
答案 5 :(得分:0)
大多数时候,我会坚持使用其他答案所建议的方法-即创建可能性数组,创建其改组版本,然后将前n个值作为样本(所有简单且一般,并且可以一成不变地实现)。
但是,如果可能性范围比您要使用的内存量大,或者与您要绘制的随机值比较大,那么这不是很好(尽管@Strilles解决方案使用了内存,但没有绘制许多随机值,所以即使是下面的用例也可能是最好的。
您的问题似乎提出的解决方案可能看起来像这样:
// select n integers from the range [from, to] (inclusive at both sides),
// don't use this approach for large values of n
// taking random values from the randomSource as needed
function randomNumbersWithoutReplacement(n, from, to, randomSource = Math.random) {
const result = [];
for (let i = 0; i < n; ++i) {
// i values have already been taken
// the +1 makes it inclusive
const rangeWidth = to - from - i + 1
let value = Math.floor(rangeWidth * randomSource()) + from
// correct the value compared to the already sampled integers
for (let j = 0; j < result.length; ++j) {
if (result[j] <= value) {
value++
}
}
result.push(value)
// sorting makes the correction loop simpler
// (and it's nice to report the result sorted too)
result.sort((a, b) => a - b)
}
return result
}
那你为什么要这个呢?
const quantumLottoNumbers = randomNumbersWithoutReplacement(6, 1, 59, quantumRandomSource)