1
3
您可以在1-1000000中选择一个随机数,然后线性向前搜索,直到找到一个空闲的位置(最终在1000000匹配失败后重叠到1)。 这样数字的分布 不是线性的 (这是当集合大部分是空的,但随后会变得越来越糟),但这比每次检查随机值快得多(我希望随机性的歪斜对测试来说不太重要),但是您确定只需要调用一次Random(),并且查找空空间所需的检查不能超过1000000次。 |
2
1
我想知道您是否可以将您的功能(或测试或两者)分为两部分:
这样,在对RandomNewGenerator的测试中,可以使用返回已知系列值的实现重写RandomGenerator。 然后,您可以测试RandomNewGenerator,而无需面对任何随机 . 我相信这确实是 JUnit的精神测试,使它们简单、快速,甚至更好:可重复 !最后一个质量实际上允许您的测试用作回归测试,这非常方便。 示例测试代码:
请注意,此代码只是一个原始示例。您可以根据需要以任何方式更改它,例如,向随机生成器提供它必须返回的值序列。例如,您可以测试是否在同一行中返回两个相同的数字。 |
3
0
一种可能有效的方法是获取初始列表并为所有索引填充100万个元素向量。
计算初始列表的大小,调用此大小
生成随机数
编辑:仔细观察@lapo的答案-我的答案看起来是一样的,但要慢一点。 |
4
0
一旦你选择的数字集开始变得太满,拉波的答案的分布就不是线性的。通过以下修改,您将得到整数的均匀分布:
|
5
0
什么意味着长久?将一个值与列表中的1.000.000值进行比较只需几毫秒。我看不到任何其他的解决方案,然后将其与除列表之外的所有值进行比较,然后您可以缩小范围进行检查。当然,您可以对列表进行排序,然后执行不超过20个步骤的二进制搜索,但是排序比线性搜索更昂贵。 我刚刚在一台速度很慢的电脑上做了一个测试,用了20毫秒的时间扫描了一个列表,其中有1000.000个数字对应于C中的给定数字。使用一个阵列,需要14毫秒。速度不够快吗?二进制搜索在0.3微秒内完成了任务。最后,使用散列集进行查找只需要大约90纳秒。 如果你必须写算法,我建议你做一个简单的技巧。进入列表-一个带有分配的号码,一个带有未分配的号码,所有号码从1到1000.000.000开始。如果您需要一个新的号码,只需得到一个介于零(包括零)和未分配号码列表长度(不包括零)之间的随机号码,在这个索引处选择号码并将其移动到分配号码列表。完成。 我也测试了这种方法,大约花费了460毫秒的时间来获取所有1.000.000个数字,从未分配的数字列表到分配的数字列表,使用未分配的数字的散列集来加速删除和分配的数字列表。只需460纳秒就可以在给定范围内生成一个新的唯一随机数。为了避免随机数生成器和哈希算法之间的干扰,必须使用经过排序的字典。 最后,你也可以把1到1000.000.000之间的数字,但是它们会被放到一个列表中,随机移动一段时间,然后一个接一个地从列表中取出。除了第一次随机播放列表外,它将在任何时候运行。 |
ecology · 基于R中随机生成数集的子集列 2 年前 |
Alan Jones · 使用random从列表创建动态列表 2 年前 |
breking bed · 单击按钮时如何随机选择唯一编号 2 年前 |
Carrot Man · 如何让熊猫数据框随机填充1和0? 2 年前 |
Justin Arnold · 范围内的随机数不是随机数 2 年前 |
Menna Magdy · 如何使用非模型字段进行过滤? 2 年前 |