人生最悪の忘れ物

以下のプログラムを使って重複しない4ケタの乱数を発生させ、数当てゲームを作りたいです。
以下のプログラムで乱数を4つ作ることができたのですが、重複してしまいます。
どのようにすればよいのですか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int i,d;
float f;
unsigned long time1;
unsigned seed;
time(&time1);
seed=time1;
srand(seed);
for (i=0;i<4;i++)
{
f=rand();
d=f*10/32768.0;
printf ("%d ",d);
}
}

A 回答 (2件)

やりたいことは、”1ケタの数字(0~9)を4つ重複しないように乱数生成する”ですかね?


(4ケタの数字1000~9999ではないですよね?プログラムの内容的に。)

実現方法はいくつかあると思います。

案1.配列に生成した乱数を記録しておいて、
  2回目以降の乱数で抽選された数字が、
  配列に記録してある数字と一致するかチェックし、
  一致した場合は、一致しなくなるまで再度乱数生成をし直す。

  以下のプログラムは一例。(手元がC++の環境なので微妙に違うけど。)
  これが良い例というわけではないです。何かバグあるかもしれん。
int i, d;
srand((unsigned)time(NULL));
int ary[4];//生成した乱数格納用
//配列初期化、乱数で選ばれる事が無い-1を入れておく。
for (i = 0; i < 4; i++){
ary[i] = -1;
}
for (i = 0; i<4; i++)
{
while (ary[i] < 0){
d = rand() % 10;
if ((d != ary[0]) && (d != ary[1]) && (d != ary[2])){ //要素数が少ないので横着
ary[i] = d;
}
}
printf("%d ", d);
}

案2.配列(要素数10)に0~9の数字を入れておいて、
  ランダムに配列内の並び順をシャッフルして、
  その後、先頭の4つを出力する。
  参考:http://mementoo.info/archives/746


案2の方がスマートな気がしますが、せっかく途中までプログラム作ってたようなので、
案1はそれの改造版ですな。
    • good
    • 3
この回答へのお礼

プログラムを完成することができました。
ありがとうございました。

お礼日時:2016/05/19 22:41

配列に重複しない整数を入れ、その配列を乱数で並び替える


というのはいかがですか。
    • good
    • 1
この回答へのお礼

アドバイス、ありがとうございました。

お礼日時:2016/05/19 22:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報