Generate “In-Range” Random Numbers in C

后端 未结 3 963
一个人的身影
一个人的身影 2021-02-10 06:32

I need to generated random numbers in the range [0, 10] such that:

  • All numbers occur once.
  • No repeated results are achieved.

Can someone pl

相关标签:
3条回答
  • 2021-02-10 06:52

    Try out this algorithm for pseudo-random numbers:

    int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    srand(time(NULL));
    
    for (int i = 0; i < 11; i++)
    {
        int swap1idx = rand() % 11;
        int swap2idx = rand() % 11;
    
        int tmp = values[swap1idx];
        values[swap1idx] = values[swap2idx];
        values[swap2idx] = tmp;
    }
    
    // now you can iterate through the shuffled values array.
    

    Note that this is subject to a modulo bias, but it should work for what you need.

    0 讨论(0)
  • 2021-02-10 07:02

    Try to create a randomize function, like this:

    void randomize(int v[], int size, int r_max) {
        int i,j,flag;
    
        v[0] = 0 + rand() % r_max; // start + rand() % end
        /* the following cycle manages, discarding it,
    the case in which a number who has previously been extracted, is re-extracted. */
        for(i = 1; i < size; i++) {
            do {
                v[i]= 0 + rand() % r_max;
                for(j=0; j<i; j++) {
                    if(v[j] == v[i]) {
                        flag=1;
                        break;
                    }
                    flag=0;
                }
            } while(flag == 1);
        }
    }
    

    Then, simply call it passing an array v[] of 11 elements, its size, and the upper range:

    randomize(v, 11, 11);
    

    The array, due to the fact that it is passed as argument by reference, will be randomized, with no repeats and with numbers occur once.

    Remember to call srand(time(0)); before calling the randomize, and to initialize int v[11]={0,1,2,3,4,5,6,7,8,9,10};

    0 讨论(0)
  • 2021-02-10 07:12

    The algorithm in Richard J. Ross's answer is incorrect. It generates n^n possible orderings instead of n!. This post on Jeff Atwood's blog illustrates the problem: http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html

    Instead, you should use the Knuth-Fisher-Yates Shuffle:

    int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    srand(time(NULL));
    
    for (int i = 10; i > 0; i--)
    {
        int n = rand() % (i + 1);
    
        int temp = values[n];
        values[n] = values[i];
        values[i] = temp;
    }
    
    0 讨论(0)
提交回复
热议问题