我有一个从 1 到 100 的数字范围,它们是列表的索引,我需要随机选择一个列表。如果在列表中找不到我要查找的内容,我需要在使我进入列表的范围内选择下一个随机整数,它不应该是之前选择的那个,有一种方法可以做到这一点在 C 中有效。我可以通过改组索引数组来做到这一点,但我想知道是否有更好的方法。
总而言之,我需要一个非常好的随机算法,它返回一个我知道是随机的并且以前从未使用过的整数。
我确实知道 rand()、srand() 和 randomize()。我不确定这些是否达到目的。
arc4random_uniform
如果在您的系统上可用,将可以解决问题:
uint32_t r = 1U + arc4random_uniform(100); // r = 1...100
如果您需要一个唯一的数字,请从一组值开始并使用Fisher-Yates(又名 Knuth) shuffle。
如果数组小于范围,您可以用唯一的随机数强制填充,然后随机播放 - 即如果您只需要十个数字,那么您可以在大约20 次随机生成调用中生成它。请注意,只有在填充过程中也订购了随机播放(为了更快的匹配查找),才需要在这种情况下进行随机播放。
另一种方法是填充向量 [1...100] 并从中随机抽取剩余元素,并在使用时删除条目。
您可以结合您的知识 srand
,rand
并 time()
与% 操作。
% n -提醒你在 n 上的除法,当 n 时它显然不能更大。
所以在代码方面:
srand(time());
int value = rand() % n; // will give you random values within interval [0,n)
但我需要提到rand() 有一些缺点,其中之一是它不提供均匀分布,因为较低值的概率更高(您可以在 stackoverflow 上找到与此主题相关的讨论)