生成带限制的随机数

时间:2012-07-25 03:48:38

标签: c random

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

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

有任何帮助吗?

谢谢。

5 个答案:

答案 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中从几个角度涵盖的经典问题。我强烈推荐这本书。