从1到200生成5个随机数的最简单方法是什么
randnum[0] < randnum[1] < randnum[2] < randnum[3] < randnum[4]
我的代码看起来像这样,但它总是在randnum [4]
溢出 limit_upper = 10; // generate random number up to 10 for randnum[0]
limit_lower = 0;
srand((time(0));
for (x = 0; x < 5; x++) {
randnum[x] = 1 + limit_lower + (unsigned int) rand() % limit_upper;
limit_lower = limit_lower + randnum[x];
limit_upper = (limit_upper * 2) + (unsigned int) rand() % limit_upper;
}
要生成的随机数不应重复。
有任何帮助吗?
谢谢。
答案 0 :(得分:4)
生成1到200之间的随机数,随意排序,丢弃重复项,直到你有5个。
答案 1 :(得分:1)
正如阿兹雷指出的那样,你过度复杂化了。生成5到200之间的五个随机数,同时抛出重复项并在完成时排序。这将很有效,除非您计划将代码扩展到超过五个数字或具有一些疯狂的性能要求。您将在以后感谢您使用直接可读的无错误代码。此外,您将删除随机性的任何人为限制。
答案 2 :(得分:1)
正如公认的答案所述,这是解决方案:
#include <stdio.h>
#include <stdlib.h>
void quicksort(int arr[], int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
if (left < j)
quicksort(arr, left, j);
if (i < right)
quicksort(arr, i, right);
}
int main() {
int i;
int x;
int random[5];
srand(time(0));
for (i = 0; i < 5; i++) {
random[i] = 0;
}
for (i = 0; i < 5; i++) {
random[i] = rand() % 201;
for (x = 1; x < i; x++) {
if (random[x] == random[i]) {
i--;
continue;
}
}
}
quicksort(random, 0, 4);
for (i = 0; i < 5; i++) {
printf("random[%0d]: %0d \n", i, random[i]);
}
return 0;
}
也许有人会发现它很有用。
答案 3 :(得分:0)
查看最后一行,在第3次迭代中,limit_upper可能会变为267。
最大增加是limit_upper * 2 + limit_upper-1(约3 * limit_upper)。
你每次播种随机发生器都会遇到同样的问题吗?
答案 4 :(得分:0)
这是Jon Bentley在Programming Perls中从几个角度涵盖的经典问题。我强烈推荐这本书。