C语言 我有这样一个代码,我不希望我的随机函数返回它以前给出的随机数,我能做些什么来修复这个[重复]

vlf7wbxs  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(78)
    • 此问题在此处已有答案**:

how to create an array of non-repeated rand numbers(4个答案)
Unique (non-repeating) random numbers in O(1)?(22个答案)
2天前关闭.

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

int main(int argc, char *argv[]) {  
    srand(time(NULL));
    int i = 0;
    int dizi[20];

    for (i = 0; i < 20; i++) {
        dizi[i] = rand() % 20;
    }   

    for (i = 0; i < 20; i++) {
        printf("%d\n", dizi[i]);
    }   
    
    return 0;
}

if else结构是否足以解决这个问题,或者我需要对rand函数做些什么?

vwoqyblh

vwoqyblh1#

如果你想用从0到19的随机数填充一个20元素的数组而不重复,那么通常用0到19填充,然后随机交换索引。

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

#define N 20

int main(void) {
    srand(time(NULL));

    int arr[N];
    for (size_t i = 0; i < N; i++) {
        arr[i] = i;
    }

    for (size_t i = 0; i < N; i++) {
        int r1 = rand() % N;
        int r2 = rand() % N;
        int temp = arr[r1];
        arr[r1] = arr[r2];
        arr[r2] = temp;
    }

    for (size_t i = 0; i < N; i++) {
        printf("%d\n", arr[i]);
    }
}

https://godbolt.org/z/avKGozfoh
正如在评论中指出的,上面的例子代表了一个幼稚的算法,使用Knuth/Fisher-Yates algorithm的忠实实现,我们得到了一个均匀分布的结果。

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

#define N 20

int main(void) {
    srand(time(NULL));

    int arr[N];
    for (size_t i = 0; i < N; i++) {
        arr[i] = i;
    }

    for (size_t i = 0; i < N; i++) {
        size_t j = rand() % (N - i) + i;
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    for (size_t i = 0; i < N; i++) {
        printf("%d\n", arr[i]);
    }
}

https://godbolt.org/z/qsfYa8r54

相关问题