0

生成 5 个从 1 到 200 的随机数的最简单方法是什么

 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;
 }

要生成的随机数不应重复。

有什么帮助吗?

谢谢你。

4

5 回答 5

4

生成从 1 到 200 的随机数,随意排序,丢弃重复项,直到有 5 个。

于 2012-07-25T04:03:42.810 回答
1

正如阿兹瑞指出的那样,你把事情复杂化了。生成 0 到 200 之间的五个随机数,同时丢弃重复项并在完成后进行排序。除非您计划将代码扩展到超过五个数字或有一些疯狂的性能要求,否则这将很有效。稍后您会感谢自己的直接可读的无错误代码。此外,您将消除对随机性的任何人为限制。

于 2012-07-25T04:07:56.687 回答
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;
     }

也许有人会发现它很有用。

于 2012-07-27T01:57:35.810 回答
0

查看您的最后一行,limit_upper 在第 3 次迭代时可能变为 267。

最大增加是 limit_upper*2 + limit_upper-1(大约 3*limit_upper)。

每次播种随机生成器时都会遇到同样的问题吗?

于 2012-07-25T04:06:05.223 回答
0

这是 Jon Bentley 在Programming Perls中从多个角度涵盖的经典问题。我强烈推荐这本书。

于 2012-07-25T04:18:24.837 回答