在0到k的区间内生成n个随机数,其中n可以大于k

时间:2015-11-22 14:37:39

标签: c sorting random

我知道有很多关于随机数的问题,但我试图在区间[0,k]中创建一个生成CMD个数字的代码。这个数字可以重复,但我不想重复相同的数字,例如:

对于[0,10]中的5个数字,我不想要:Windows

对于[0,10]中的10个数字,我不想要:n

对于[0,10]中的5个数字,我想要类似:1 1 3 3 3

对于[0,10]中的5个数字,我想要类似:1 3 3 3 3 4 4 4 8 8

好的,这不难做到,我这样做了:

0 2 3 3 4

问题是,我想以升序和降序生成这些数字。我试图通过以下方式来实现:

0 0 1 2 4 5 5 5 7 10

此代码将生成随机数,有时会重复数字,这就是我想要的。但是,如果static void random_numbers(unsigned int n) { unsigned int i, interval; interval = 1000000; srand((unsigned int) time(NULL)); for(i = 0; i < n; i++) { printf("%u\n", (unsigned int) rand() % (interval + 1)); } } 为100,则可以生成最大数字900.我还没有找到一种方法来设置间隔。

我想方向但不好,使用static void ascending(unsigned int n) { unsigned int i, acc; srand((unsigned int) time(NULL)); for(i = 0, acc = 0; i < n; i++) { acc += (unsigned int) rand() % 10; /* For descending, just change + to - */ printf("%u\n", acc); } } 函数生成数字,将它们存储在数组中并对它们进行排序(升序或降序)以及打印后,但这需要时间和内存。

此代码的目的是生成用于测试排序算法的数据。我不想下载DataSet,我想创建自己的函数。这些数字将打印在n上,并使用linux上的重定向,我将它们存储在一个文件中。

感谢。

2 个答案:

答案 0 :(得分:0)

// Try this.  
static void ascending(unsigned int n, int gap) {
    int i, ofs, rnum;
    ofs = 0; // ofs at 0  
    srandom((int) time(NULL));
    for (i = 0; i < n; i++, ofs += gap) { // up the ofs by gap.  
        rnum = ofs + rand() % gap;
        printf("%d\n", rnum);
    }
}  

int main(int argc, char **argv) {
    int n, gap;

    n = atoi(argv[1]);
    gap = atoi(argv[2]);
    ascending(20, 11);
}

答案 1 :(得分:0)

不是直接在一个操作中进行,而是分解为两个:

  1. 在区间[0..k]
  2. 中生成n个随机数
  3. 分拣。
  4. 所以,像这样:

    #include <stdlib.h>
    #include <stdio.h>
    
    static int compare_asc(const void * uint1, const void * uint2)
    {
        return (*(const unsigned int *) uint1) - 
              (*(const unsigned int *) uint2);
    }
    
    static int compare_desc(const void * uint1, const void * uint2) 
    {
        return compare_asc(uint2, uint1);
    }
    
    unsigned int * random_range(unsigned int n, unsigned int k)
    {
        int i;
        unsigned int * range= malloc(sizeof(unsigned int) * n);
        if (range) {
           for(i = 0; i < n; ++i) {
              range[i] = rand() % k;
           }
        }
        return range;
    }
    
    unsigned int * random_ascending(unsigned int n, unsigned int k)
    {
        unsigned int * range = random_range(n, k);
        if(range) {
            qsort(range, n, sizeof(unsigned int), compare_asc);
        }
        return range;
    }
    
    // implementing random_descending(n,k) is left as exercise ...
    
    int main(int argc, char*argv[])
    {
        unsigned int k = 22, n = 42, i;
        unsigned int * range;
        srand((unsigned int) time(NULL));
        range = random_ascending(n, k);
        if(range) {
            for(i = 0; i < n; ++i) {
                printf("range[%d] = %d\n", i, range[i]);
            }
            free(range); // need to free
            return 0;
        }
        else {
            printf("Unable to allocate necessary memory...\n");
            return 1;
        }
    }