C言語 重複なし乱数生成の効率的な方法

C言語では、rand()関数を使用してランダムな数値を生成することができますが、重複しないランダムな数値を生成するには、以下の方法を使用できます:

  1. 新しく生成されたランダムな数値を保持するために配列を使用し、新しいランダムな数値を生成する際には、既に配列にその数値が存在するかどうかを確認し、存在する場合は再度生成するまで別の重複のないランダムな数値を生成します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    int nums[10]; // 存储生成的随机数
    int index = 0;

    srand((unsigned)time(NULL)); // 初始化随机数种子

    while (index < 10) {
        int new_num = rand() % 100; // 生成0~99的随机数

        // 检查数组中是否已经存在该随机数
        int i;
        int is_duplicate = 0;
        for (i = 0; i < index; i++) {
            if (nums[i] == new_num) {
                is_duplicate = 1;
                break;
            }
        }

        if (!is_duplicate) {
            nums[index] = new_num;
            index++;
        }
    }

    // 输出生成的不重复随机数
    for (int i = 0; i < 10; i++) {
        printf("%d ", nums[i]);
    }

    return 0;
}
  1. フィッシャー・イェーツのシャッフルアルゴリズムを使用して、ランダムな順列を生成し、最初のn個の要素を取り出して、重複のないランダムな数値を作成できます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void shuffleArray(int arr[], int n) {
    srand((unsigned)time(NULL));

    for (int i = n - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

int main() {
    int nums[10]; // 存储生成的随机数

    for (int i = 0; i < 10; i++) {
        nums[i] = i;
    }

    shuffleArray(nums, 10);

    // 输出生成的不重复随机数
    for (int i = 0; i < 10; i++) {
        printf("%d ", nums[i]);
    }

    return 0;
}

実際のニーズに応じて適切な方法を選択できる、重複しない乱数を生成する2つの方法が上記にあります。

bannerAds