我想在一个范围内获得一个随机数,但要排除一个数字(例如从1到1000排除577)。我已经搜索了解决方案,但是没有解决我的问题。
我想要像这样的东西:
Math.floor((Math.random() * 1000) + 1).exclude(577);
我尽量避免使用 for
循环来创建数组,因为数组的长度总是不同的(有时为1到10000,有时为685到888555444等),而生成它的过程可能会耗费太多时间。
我已经尝试了:
我该如何实现这个目标?
我想在一个范围内获得一个随机数,但要排除一个数字(例如从1到1000排除577)。我已经搜索了解决方案,但是没有解决我的问题。
我想要像这样的东西:
Math.floor((Math.random() * 1000) + 1).exclude(577);
我尽量避免使用 for
循环来创建数组,因为数组的长度总是不同的(有时为1到10000,有时为685到888555444等),而生成它的过程可能会耗费太多时间。
我已经尝试了:
我该如何实现这个目标?
在特定范围内([a, b]
),除了一个值 c
,获得随机整数的最快方法是在 a
和 b-1
之间生成它,如果它大于或等于 c
,则将其增加一。
下面是一个可行的函数:
function randomExcluded(min, max, excluded) {
var n = Math.floor(Math.random() * (max-min) + min);
if (n >= excluded) n++;
return n;
}
一种可能性是不加1,如果出现该数字,则分配最后一个可能的值。
例如:
var result = Math.floor((Math.random() * 100000));
if(result==577) result = 100000;
这样一来,您就不需要重新启动随机方法,而是重复使用它。并且达到了作为随机数的目标。
// min - integer
// max - integer
// exclusions - array of integers
// - must contain unique integers between min & max
function RandomNumber(min, max, exclusions) {
// As @Fabian pointed out, sorting is necessary
// We use concat to avoid mutating the original array
// See: https://dev59.com/w2kw5IYBdhLWcg3w2-XH
var exclusionsSorted = exclusions.concat().sort(function(a, b) {
return a - b
});
var logicalMax = max - exclusionsSorted.length;
var randomNumber = Math.floor(Math.random() * (logicalMax - min + 1)) + min;
for(var i = 0; i < exclusionsSorted.length; i++) {
if (randomNumber >= exclusionsSorted[i]) {
randomNumber++;
}
}
return randomNumber;
}
此外,我认为 @JesusCuesta 的回答提供了更简单的映射,并且更好。
更新:我的原始答案有许多问题。
function randomExcluded(start, end, excluded) {
var n = excluded
while (n == excluded)
n = Math.floor((Math.random() * (end-start+1) + start));
return n;
}
myRandom = randomExcluded(1, 10000, 577);
function RandomNumber(min, max, exclusions) {
var hash = new Object();
for(var i = 0; i < exclusions.length; ++i ) { // TODO: run only once as setup
hash[exclusions[i]] = i + max - exclusions.length;
}
var randomNumber = Math.floor((Math.random() * (max - min - exclusions.length)) + min);
if (hash.hasOwnProperty(randomNumber)) {
randomNumber = hash[randomNumber];
}
return randomNumber;
}
var max = 99999, min = 1, exclude = 577;
var num = Math.floor(Math.random() * (max - min)) + min ;
while(num == exclude || num > max || num < min ) {
var rand = Math.random() > .5 ? -20 : 20 ;
num += Math.floor((Math.random() * (rand));
}
import random
def rng_generator():
a = random.randint(0, 100)
if a == 577:
rng_generator()
else:
print(a)
#main()
rng_generator()
从计算中排除数字:
function toggleRand() {
// demonstration code only.
// this algorithm does NOT produce random numbers.
// return `0` - `576` , `578` - `n`
return [Math.floor((Math.random() * 576) + 1)
,Math.floor(Math.random() * (100000 - 578) + 1)
]
// select "random" index
[Math.random() > .5 ? 0 : 1];
}
console.log(toggleRand());
或者使用 String.prototype.replace()
与 RegExp
/^(577)$/
匹配应从结果中排除的数字;利用 new Date().getTime()
、isNaN()
和 String.prototype.slice()
将其替换为范围内的另一个随机数 [0-99]
console.log(
+String(Math.floor(Math.random()*(578 - 575) + 575))
.replace(/^(577)$/,String(isNaN("$1")&&new Date().getTime()).slice(-2))
);
也可以使用String.prototype.match()
来过滤结果:
console.log(
+String(Math.floor(Math.random()*10))
.replace(/^(5)$/,String(isNaN("$1")&&new Date().getTime()).match(/[^5]/g).slice(-1)[0])
);
Math.random() > .5 ? 0 : 1
来选择在 0
和 1
之间返回随机索引。 - guest271314Math.random() > .5 ? 0 : 1
在第一部分或第二部分中查找将 不会 生成纯随机数,因为获得每个数字的概率不相等。以 [Math.floor((Math.random() * 1) + 1), Math.floor(Math.random() * (100000 - 3 + 1))][Math.random() > .5 ? 0 : 1]
为例:它将在50%的情况下生成 1
。 - Marco BonelliMath.random()
会生成“纯随机数”吗? - guest271314