使用C生成不重复的随机数列表
Generating list of random numbers without duplication using C?
我正在制作一个益智游戏,我想生成一个介于某个极限之间的随机数列表。我已经使用了rand和srand函数,但它也给了我重复的值。我想生成一个没有重复的随机列表,我该怎么做?
通常的方法类似于:
populate an array source_array of size <n> with numbers from 0 to n-1
while n > 0
use rand to generate a random number x in the range 0..n-1
add source_array[x] to the result list
source_array[x] = source_array[n-1]; // replace number just used with last value
--n; // next time, one less number
inArray()
函数的东西,并将其与do ... while
循环一起使用,该循环将生成一个随机数,直到它生成一个不在数组中的数编辑:w00te的评论链接到这个答案,我认为这个答案比我的方法更好,绝对值得一读。这也是David Gelhar的简短建议。
当限制很高时,并且您只想生成几个随机数时,此方法的结果是合适的。
#!/usr/bin/perl
($top, $n) = @ARGV; # generate $n integer numbers in [0, $top)
$last = -1;
for $i (0 .. $n-1) {
$range = $top - $n + $i - $last;
$r = 1 - rand(1.0)**(1 / ($n - $i));
$last += int($r * $range + 1);
print "$last ($r)n";
}
请注意,这些数字是按升序生成的,但之后可以进行混洗。
为了避免重复,您可以将所有生成的数字存储在一个列表中,在每次迭代时,检查该数字是否已经生成;如果是,则重新生成,如果不是,则将其添加到列表中并显示。
您可以这样做:
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUMBER_VALUE 60
#define HOW_MANY_NUMBERS 10
int main ( void )
{
int numbers[HOW_MANY_NUMBERS];
int counter = 0;
while ( counter < HOW_MANY_NUMBERS)
{
int tempRandom = rand ( MAX_NUMBER_VALUE + 1 );
int check = 0;
while ( check <= counter )
{
if ( number[counter] == number[check] )
tempRandom = rand ( MAX_NUMBER_VALUE + 1 );
}
printf("Random number #%d - Value: %d", counter, tempRandom);
}
}
你需要执行此操作,但它有效。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何在C中检查随机数列表中的元素
- 如何在随机数列表中查找大于或小于的元素
- 如何在C++中创建数字列表,以便它可以选择一个随机数?
- C++:随机数列表:x 个随机整数
- 在伪随机数中使用整个列表
- C++:如何生成非重复随机数列表
- 使用C生成不重复的随机数列表
- 从整数列表中选择一个随机数
- 试图生成整数的随机数组,每次运行得到相同的列表.c++
- 从生成的随机数列表中找出最小和最大的数