如何避免使用 rand 和 srand 得到重复的数字?
How can I avoid getting repeated numbers with rand and srand?
我有时会用下面的代码得到相同的随机数。我该如何解决这个问题?
int main()
{
int numbers[6];
srand(time(0));
for(int j=1;j<=6;j++)
{
numbers[j]=rand()%10;
printf("\n%d",numbers[j]);
}
}
主要问题是你的范围有点小,所以重复,虽然它们不一定常见,但它们会突然出现足以让你烦恼。
我有两个建议,第一个是增加随机数的范围
int main(void) {
int nums[6];
srand(time(NULL));
for (int i = 0; i < 6; ++i) {
nums[i] = rand() % 100; // range has been increased
printf("%d\n", nums[i]);
}
}
另一种绝对确保唯一编号的方法是在添加之前检查您的数组是否已包含该编号。正如您可能猜到的那样,根据您实现它的方式,时间复杂度将成为一个因素。
int main(void) {
int nums[6];
srand(time(NULL));
for (int i = 0; i < 6; ++i) {
int temp = rand() % 10;
bool exists = false;
for (int j = 0; j < i; ++j) {
if (nums[j] == temp) {
exists = true;
break;
}
}
if (!exists) {
nums[i] = temp;
printf("%d\n", nums[i]);
}
else {
--i; // force the loop back
}
}
}
我有时会用下面的代码得到相同的随机数。我该如何解决这个问题?
int main()
{
int numbers[6];
srand(time(0));
for(int j=1;j<=6;j++)
{
numbers[j]=rand()%10;
printf("\n%d",numbers[j]);
}
}
主要问题是你的范围有点小,所以重复,虽然它们不一定常见,但它们会突然出现足以让你烦恼。
我有两个建议,第一个是增加随机数的范围
int main(void) {
int nums[6];
srand(time(NULL));
for (int i = 0; i < 6; ++i) {
nums[i] = rand() % 100; // range has been increased
printf("%d\n", nums[i]);
}
}
另一种绝对确保唯一编号的方法是在添加之前检查您的数组是否已包含该编号。正如您可能猜到的那样,根据您实现它的方式,时间复杂度将成为一个因素。
int main(void) {
int nums[6];
srand(time(NULL));
for (int i = 0; i < 6; ++i) {
int temp = rand() % 10;
bool exists = false;
for (int j = 0; j < i; ++j) {
if (nums[j] == temp) {
exists = true;
break;
}
}
if (!exists) {
nums[i] = temp;
printf("%d\n", nums[i]);
}
else {
--i; // force the loop back
}
}
}