我想生成0到1000之间永远不会重复的唯一随机数(即6不会出现两次),但这并不是像以前的值的O(N)搜索那样.这可能吗?
我想要一个伪随机数生成器,它可以按随机顺序生成没有重复的数字.
例如:
随机(10)
可能会返回5,9,1,4,2,8,3,7,6,10
有没有更好的方法来做到这一点,除了使数字的范围和洗牌,或检查生成的列表重复?
此外,我希望它在没有整个范围的情况下有效地生成大数字.
我看到每个人都建议使用随机算法.但是,如果我想生成大的随机数(1024字节+),那么该方法将占用更多的内存,而不是我刚使用常规RNG并插入到Set中,直到它是指定的长度,对吧?对此没有更好的数学算法.
说我有一个长度数字的链表N.N非常大,我事先并不知道确切的价值N.
如何最有效地编写一个从列表中返回k完全随机数的函数?
说我有y不同的值,我想x随机选择它们.这样做的有效算法是什么?我可以打电话给rand() x时间,但如果很大x,表现会很差y.
请注意,此处需要组合:每个值应具有相同的概率,但结果中的顺序并不重要.当然,任何生成排列的算法都是合格的,但我想知道如果没有随机顺序要求,是否可以更有效地做到这一点.
如何有效地生成0和上限N之间的K个非重复整数的列表,涵盖了这种情况的排列.
该问题给出了所有必要的数据:在给定区间[0,N-1]内生成一系列K个非重复整数的有效算法是什么.平凡算法(产生随机数,并把它们添加到序列,看着他们,看看他们是否已经在那里之前)是非常昂贵的,如果ķ大且足够接近ñ.
在从链表中有效地选择一组随机元素中提供的算法似乎比必要的更复杂,并且需要一些实现.我刚刚发现了另一种似乎可以完成工作的算法,只要您知道所有相关参数,只需一次通过即可.
可能重复:
O(1)中的唯一随机数?
如何在C中填充具有唯一值(无重复项)的整数数组?
int vektor[10];
for (i = 0; i < 10; i++) {
vektor[i] = rand() % 100 + 1;
}
//No uniqueness here
Run Code Online (Sandbox Code Playgroud)