随机化4个不同的数字

时间:2016-01-02 18:21:58

标签: c

我试图在C中随机化4个不同的数字并尝试下一个代码:

{
    int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
    int i = 0;
    while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num3 == num2)
    {
        num1 = rand() % 7;
        num2 = rand() % 7;
        num3 = rand() % 7;
        num4 = rand() % 7;
    }
    printf("%d %d %d %d\n", num1, num2, num3, num4);
}

代码假设检查数字是否相等,如果它们相等,则需要生成新数字,直到它们全部不同为止。 但由于某种原因,它不能很好地工作,即使是正确的数字,它也会使它们成为错误的,它会成为无限循环。

我错过了什么?

4 个答案:

答案 0 :(得分:2)

试试这个

void
get_random_values(int *values)
{
    int source[] = {0, 1, 2, 3, 4, 5, 6};
    for (int i = 0 ; i < 7 ; ++i)
    {
        int saved;
        int j = rand() % 7;
        int k = rand() % 7;
        saved = source[j];
        source[j] = source[k];
        source[k] = saved;        
    }
    values[0] = source[0];
    values[1] = source[1];
    values[2] = source[2];
    values[3] = source[3];
}

int
main(void)
{
    int values[4];
    srand(time(NULL));
    get_random_values(values);
    for (int i = 0 ; i < 4 ; ++i)
        fprintf(stderr, "%d ", values[i]);
    fprintf(stderr, "\n");

    return 0;
}

不要忘记在程序启动时设置随机种子srand(),否则您将始终获得相同的序列。

答案 1 :(得分:2)

此代码将在0 ... 6范围内选择4个不同的数字,它通过创建可用数字的数组来工作,因为每个数字都被选中,它将从列表中删除。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define RANGE   7                   // how many different numbers
#define PICK    4                   // how many to pick

int main(void) {
    int pool[RANGE];
    int size, n, i;
    for (size=0; size<RANGE; size++) {
        pool[size] = size;          // create number pool 0..6
    }
    srand((unsigned)time(NULL));

    // pick different numbers
    for(i=0; i<PICK; i++) {
        n = rand() % size;          // random array index
        printf("%d ", pool[n]);     // select number from pool
        pool[n] = pool[--size];     // remove from pool
    }
    printf("\n");
    return 0;
}

答案 2 :(得分:1)

获取随机的unbiased序列:

#include <stdio.h>
#include <stdlib.h>

#define N 7

int main(int argc, char **argv)
{
    // seed random number generator with first argument for easier testing 
    if (argc > 1) {
        srand(atoi(argv[1]));
    }

    int array[N] = {0,1,2,3,4,5,6};

    // Fisher–Yates shuffle:
    // https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm
    for (unsigned i = 0; i < N - 1; ++i) {
        unsigned modulo = N - i;

        // unbiased rand() % modulo:
        // https://stackoverflow.com/a/10989061/416224
        unsigned j;
        do {
            j = rand();
        } while (j >= RAND_MAX - (RAND_MAX % modulo));
        j %= modulo;

        if (j > 0) {
            int tmp = array[i];
            array[i] = array[i + j];
            array[i + j] = tmp;
        }
    }

    for (unsigned i = 0; i < N; ++i) {
        printf("%u. %d\n", i + 1, array[i]);
    }

    return 0;
}

请按照代码中的参考链接进行操作。

答案 3 :(得分:1)

我建议通用解决方案:

  • 任何大小的数组

  • 作为参数发送的下限和上限。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void random(int* values, int amount, int lower_bound, int upper_bound)
    {
        int i=0, j=0, temp;
        if(amount > upper_bound - lower_bound + 1)
            return; // if there are more numbers than given bound
    
        for(i=0; i<amount; )
        {
            temp = rand() % ( upper_bound - lower_bound + 1 ) + lower_bound;
            for(j=i-1; j>=0; --j)
                if(temp==values[j])
                    break;
    
            if(temp==values[j])
                continue;
    
            values[i]=temp;
            ++i;
        }
    }
    
    int main()
    {
        srand(time(NULL));
        int arr[4]={0,0,0,0};
        random(arr, 4, 5, 10);
        for(int i=0; i<4; ++i)
            printf("%d\n", arr[i]);
    }
    

使用此功能,您可以拥有(例如)10个原始值,从-6到7。