生成 0 到“x”之间的唯一随机数(整数)

IT技术 javascript random
2021-02-06 10:03:55

我需要生成一组唯一的(无重复的)整数,介于 0 和给定数字之间。

那是:

var limit = 10;
var amount = 3;

如何使用 Javascript 生成 1 到 10 之间的 3 个唯一数字?

6个回答

使用基本Math方法:

  • Math.random() 返回 0 到 1 之间的随机数(包括 0,不包括 1)。
  • 将此数字乘以所需的最高数字(例如 10)
  • 将此数字向下舍入为其最接近的整数

    Math.floor(Math.random()*10) + 1
    

例子:

//Example, including customisable intervals [lower_bound, upper_bound)
var limit = 10,
    amount = 3,
    lower_bound = 1,
    upper_bound = 10,
    unique_random_numbers = [];

if (amount > limit) limit = amount; //Infinite loop if you want more unique
                                    //Natural numbers than exist in a
                                    // given range
while (unique_random_numbers.length < limit) {
    var random_number = Math.floor(Math.random()*(upper_bound - lower_bound) + lower_bound);
    if (unique_random_numbers.indexOf(random_number) == -1) { 
        // Yay! new random number
        unique_random_numbers.push( random_number );
    }
}
// unique_random_numbers is an array containing 3 unique numbers in the given range
@benhowdle89 有人将您的问题标记为家庭作业。这是真的?如果没有,请移除标签。
2021-03-27 10:03:55
@benhowdle89 在循环中,在变量中random_numbers我先把逻辑放在这里,然后是例子。
2021-04-03 10:03:55
不,它不是,也不是重复的 :(
2021-04-03 10:03:55
答案是错误的。不要使用 round() - 使用 floor() 或 ceil() 否则,您的结果将不会均匀分布。例如,如果您想要一个介于 0 和 3 之间的随机整数,并且您使用 round(),那么最终得到 1 和 2 的频率将高于 0 和 3,因为有更多可能的随机值会四舍五入为 1 和 2,因为round() 可以向上或向下舍入。使用地板或天花板力使浮动始终朝同一方向旋转,从而产生更分散的结果。
2021-04-07 10:03:55
更改“Math.random()*(upper_bound - lower_bound + 1)”删除+ 1,我在lower_bound = 0,upper_bound = 5上测试,+ 1部分有时我得到6
2021-04-09 10:03:55
Math.floor(Math.random() * (limit+1))

Math.random()生成一个介于 0 和 1 之间的浮点数,Math.floor()并将其向下舍入为整数。

通过将其乘以一个数字,您可以有效地创建 range 0..number-1如果您希望在从num1到 的范围内生成它num2,请执行以下操作:

Math.floor(Math.random() * (num2-num1 + 1) + num1)

要生成更多数字,只需使用 for 循环并将结果放入数组或直接将它们写入文档。

@paulzag 你说得对,感谢指出!一个简单的解决方法是将 + 1 移动到 Math.floor 内,但是它可能很少会生成一个高于上限的数字......嗯
2021-03-22 10:03:55
@Daniel 是的,但问题是它可以超过限制 1,非常罕见,除了减去可以从 limit+1 中减去的最小浮点单位之外,没有办法解决这个问题,而且我零线索要做到这一点。
2021-03-28 10:03:55
如果我想要一个 0 到 5 之间的随机数,这不会产生任何结果 = 0。我在想,因为 + 1 使最小结果 = 1
2021-04-10 10:03:55
我用 num1 = 0 和 num2 = 10 尝试了这个,如果我运行足够多次,它会生成 0 和 10。很好的答案 - 谢谢!
2021-04-10 10:03:55
function generateRange(pCount, pMin, pMax) {
    min = pMin < pMax ? pMin : pMax;
    max = pMax > pMin ? pMax : pMin;
    var resultArr = [], randNumber;
    while ( pCount > 0) {
        randNumber = Math.round(min + Math.random() * (max - min));
        if (resultArr.indexOf(randNumber) == -1) {
            resultArr.push(randNumber);
            pCount--;
        }
    }
    return resultArr;
}

根据所需的范围,返回整数的方法可以更改为:ceil (a,b], round [a,b], floor [a,b), for (a,b) 是将 1 添加到 min 的问题地面。

请记住,这不是均匀分布的。我刚刚发现这一点的同时试图生成[0,100](非唯一的)随机数和想你的Math.round(min + Math.random() * (max - min))解决方案,并在一百万生成的数字测试我有大约一半的许多实例0,并100比其他任何结果。
2021-03-24 10:03:55
Math.floor(Math.random()*limit)+1
for(i = 0;i <amount; i++)
{
    var randomnumber=Math.floor(Math.random()*limit)+1
    document.write(randomnumber)
}
@NaturalBornCamper 问题指定了 1 到 10 之间的数字。
2021-03-23 10:03:55
你永远不会得到0,我认为这是不正确的
2021-04-04 10:03:55