如何在特定范围之间创建新的随机整数

时间:2012-11-08 07:50:11

标签: c gcc random

我有一系列数字1到100,它们是列表的索引,我需要随机选择一个列表。如果找不到我在列表中寻找的内容,我需要选择一个范围内的下一个随机整数,它将我带到列表中,它不应该是之前选择的那个, 有一种方法可以在C中有效地完成这项工作。我可以通过改组索引数组来实现这一目标,但我想知道是否有更好的方法。

总而言之,我需要一个非常好的随机算法,它返回一个我知道是随机的整数,之前从未使用过。

我知道rand(),srand()和randomize()。我不确定这些是否符合目的。

2 个答案:

答案 0 :(得分:2)

arc4random_uniform可以解决问题,如果您的系统可用:

uint32_t r = 1U + arc4random_uniform(100); // r = 1...100

如果您需要唯一编号,请从值数组开始并使用Fisher-Yates (aka Knuth) shuffle

如果阵列小于范围,你可以用强大的填充方式填充唯一的随机数,然后随机播放 - 即如果你只需要十个数字,那么你可以在中生成它 20随机-gen电话。请注意,如果您还在填充期间对其进行了排序(以便更快地进行匹配查找),则仅在此方案中需要随机播放。

另一种方法是填充向量[1 ... 100]并随机抽取其中的剩余元素,并在使用时删除条目。

答案 1 :(得分:0)

您可以将srandrandtime()的知识与%操作结合起来。
%n - 在n上为你提供来自分部的提醒,当n时,这显然不会更大。
所以在代码方面:

srand(time());
int value = rand() % n; // will give you random values within interval [0,n)

但是我需要提一下 rand()有一些缺点,其中之一是它没有提供均匀分布,因为较低值的概率较高(你可以找到与这个主题相关的讨论)在stackoverflow上)