如何在 JS 中执行此操作。您需要从到but 中获取20随机数,以便这些随机数不会重复。这个怎么做?所有这些业务都应该循环进行。这是一半代码的示例。11000
var random_start = 1; // От какого генерировать
var random_end = 1000; // До какого генерировать
allСycles = 20;
for(countCycles=1;countCycles<=allСycles;countCycles++){
alert ("Случайное рандомное и уникально не повторающиеся число от 1 до 1000");
}
我按这样的提示试了一下,但是有时候数字会重复
var random_end = 1000;
allСycles = 20;
for(countCycles=1;countCycles<=allСycles;countCycles++){
var test = Math.floor(Math.random()*(random_end+1)+1);
alert(test);
}
我正在使用Lodash库
没有她:
另一个注意内存和计算资源的选项(尤其是对于大范围的值)。
不需要预先创建和填充大数组,循环的迭代次数对应生成数字的数量(没有枚举值以防发生冲突)。
这个怎么运作?
假设我们需要从 0..9(含)范围内选择三个数字:
我们从 0 到 9 中选择一个随机索引,例如 3 掉落:
现在,为了不再遇到数字 3,我们认为它已被使用,并将第 (9) 行的最后一个元素转移到它的位置:
现在我们有九个元素,我们再次从中随机选择一个,将最后一个放回原来的位置,依此类推。
因为 输出所需的数字相对较少,那么我们只记住排列(对于其余元素,值仅等于它们的索引)。为此,使用了js-object m(键是系列中的位置,值是值)。
带有 ES6 的 VanillaJs
基于算法
range/shuffle/slice不适合非常大的值范围
说明:
范围:
[...Array(to-from+1).keys()].map(i=>i+from)Array(to-from+1)- 所需长度的数组[...ArrayIterator]- 将其转换为数组.map(i => i + from)- 为每个元素添加一个最小值洗牌:
.reduce((arr, elt) => (arr.splice(Math.random() * (arr.length + 1), 0, elt), arr), [])我们简单地使用来
reduce构建一个新数组,在随机位置插入每个新元素优化范围
关键是在初始阶段我们计算范围,在这个过程中我们减去当前值+以前的值,从而减少形成随机的范围。并且通过将先前的值添加到接收到的值中,我们就不可能重复该数字。
没有 ES6,香草。老实说,我只是终于找到了用处
do... while,至少在日历上标出这一天。非常抱歉...我的意思是 '\t' 和 '\n' 你可以自己做。
创建数组并混合它们非常耗费资源。我提供我自己的版本,操作原理非常简单。我们生成一个随机数,如果该数组中还没有这样的数字,则将其放入数组中。然后我们重复此操作,直到数组包含范围内所需数量的随机数。
优点:
缺陷:
实际上,对于 1 到 1000 范围内的 20 个随机数,当运行该函数超过 1,000,000 次时,我得到的“双打”不超过 5 个。
但是,这不是一个可靠的解决方案!最终要循环多少次是不可能的!因此,下面我将提供一个稍微复杂但可靠的选项。
在此解决方案中,我们生成给定数量的随机数,然后我们才简单地“唯一”重复项。
找到一个 double 后,我们正在寻找最近的“未占用”数字,从“double”向上和向下检查一个循环,在每次迭代时加一个。一旦我们找到一个“免费号码”,我们就会用它替换“双”,然后继续寻找“重复”。依此类推,直到所有数字都是唯一的。
通过这个解决方案,我们可以准确地计算出最坏情况下的迭代次数。很有可能还有更完美的“唯一性”算法,我会继续往这个方向挖掘。
纯粹为了收藏,使用
Set.