【C言語】重複しない複数の乱数を生成する方法

C言語で重複しない複数の乱数を生成するには、

  1. 乱数を生成
  2. 保存したデータにいなかったら保存

のループを必要なデータ数分行うだけで良いです。

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

// データ数
#define	N	100
// 乱数の最小値
#define	MIN	0
// 乱数の最大値
#define	MAX	100

int main(void)
{
	// 生成するデータを格納する変数
	int data[N] = {0};
	// 乱数生成用変数
	int rnd;
	// データ検索フラグ
	int bFind;
	// ループカウンタ
	int i, j;
	
	// 乱数シード初期化
	srand((unsigned)time(NULL));
	
	for(i = 0; i < N; i++)
	{
		do
		{
			// フラグ初期化
			bFind = 0;
			// 乱数生成
			rnd = rand() % (MAX - MIN) + MIN;
			// データ中に生成した乱数と同値のデータがないか確認
			for(j = 0; j < i; j++)
			{
				// データ中に見つかった場合
				if(data[j] == rnd)
				{
					// フラグを立てて再度乱数を生成する
					bFind = 1;
					break;
				}
			}
		}while(bFind);
		// データに生成した乱数を保存する
		data[i] = rnd;
	}

	// 生成した乱数を出力する
	for(i = 0; i < N; i++)
	{
		printf("%d\n", data[i]);
	}
	
	return 0;
}

ちなみに、Nよりも(MAX – MIN)が小さい場合は無限ループにハマるのでご注意を。(重複しない乱数を使用したい時点でありえないけど)

割と冗長な書き方をしているのでもっと効率の良い方法もあると思いますが、その辺は自分で考えてみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です