• ベストアンサー

乱数について教えてください!

私はいまC言語で,1~10までの数字をランダムに10個発生させるプログラムを作っています. 単にランダムに発生させることはできるのですが,そうではなくて,10個の中に同じ数字が出てこないようにしたいのです. その方法についてどなたかご存知の方がおられましたら,ご教授お願い致します.

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.5

フラグを立てる方法でも、 発生する乱数を、最初は1~10、次は1~9…としておいて、 「使っていない数字の何番目」と解釈するようにすると 無駄な乱数の生成を抑えることができます。 今書きました。使えれば使ってください。 いちおう動きますが詳しいテストはしてません。 /*0~9の乱数を作る*/ #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM 10 int random_number(int n); int main(void){ int output[NUM]; int flag[NUM]; int i, j, counter; int x; /*乱数を起動時ごとに違う値にする初期化*/ srand(time(NULL)); /*フラグ初期化*/ for(i = 0; i < NUM; i++){ flag[i] = 0; } /*乱数発生*/ for(i = 0; i < NUM; i++){ x = random_number(NUM - i); /*まだ使ってない数のx番目を探す*/ for(j = 0; j < NUM; j++){ if(flag[j] == 0)x--; if(x < 0){ flag[j] = 1; output[i] = j; break; } } } for(i = 0; i < NUM; i++){ printf("%d ", output[i]); printf("\n"); } return 0; } /*0からn-1までの乱数を返す関数*/ int random_number(int n){ return rand() / (RAND_MAX / n + 1); }

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

回答No.9

1~10を並べておいてシャッフルする方法が簡単で無駄がないと思います。 #include <stdio.h> #include <stdlib.h> int main(void) {  int list[10]={1,2,3,4,5,6,7,8,9,10};  int i,j,tmp;  for (i=0;i<10;i++) {   j=rand()%10; /* 0~9の擬似乱数 */   tmp=list[i];list[i]=list[j];list[j]=tmp; /* i番目とj番目を入れ替え */  }  for (i=0;i<10;i++) {   printf("%2d ",list[i]);  }  return 0; }

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.8

そのような場合は1~10を順にセットした配列を用意し、ランダムにシャッフルするという方法がシンプルでしょう。シャッフルには単純選択ソートを応用したアルゴリズムを用いると、乱数生成の無駄がありません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define CNT 10 void shuffle(int *, int); int main(void) {   int array[CNT], i, r, tmp;   /* 乱数系列初期化 */   srand(time(NULL));   /* 配列に1~CNTをセット */   for (i = 0; i < CNT; i++)     array[i] = i + 1;   /* シャッフル */   shuffle(array, CNT);   /* 確認 */   for (i = 0; i < CNT; i++)     printf("%2d\n", array[i]);   return 0; } void shuffle(int *list, int n) {   int r, tmp;   while (--n) {     r = (int)(rand() / (RAND_MAX + 1.0) * (n + 1));     tmp=list[n], list[n]=list[r], list[r]=tmp;   } } ※インデントは全角空白なので、コピーする時はタブなどに置換して下さい。

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

/* 1~10の数を適当に作る */ #include <stdio.h> #include <stdlib.h> #include <sys/timeb.h> void main(void){ int r,c,i; int list[10]={ 0,0,0,0,0,0,0,0,0,0 }; int result[10]; struct timeb tm; ftime(&tm); srand(tm.millitm); c=0; for(i=0;i<10;i++){ if(list[i]==0){ if(list[r=rand()%10]++==0) result[c++]=r+1; i--; } } for(i=0;i<10;i++) printf("%2d\n",result[i]); }

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • GoF
  • ベストアンサー率37% (34/91)
回答No.6

1) 1~10を代入した配列を用意する 2) 乱数で0~9を発生させて、取り出す要素番号を取得 3) 配列の中身を別の配列にPUSH 4) 該当要素を配列から抹消 5) 1)~4) を 10回繰り返す 但し 2)の最大値は-1する 10個程度なら、配列でなくて'0123456789'の文字操作で置換可能

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

配列に1から10の数字を入れておきます。 1から9の乱数を引いてその順番の数値と10番目の数値を交換します。 これを100回くらい適当に繰り返します。

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • syosyosyo
  • ベストアンサー率33% (32/95)
回答No.3

10個固定でいいのであれば、フラグを10個用意して、一度発生した数字はフラグを立ててはどうですか? フラグが立っている場合は、フラグの立ってない数字が出るまで、繰り返し乱数を発生させるわけです。 10個固定ということで、レスポンスやプログラムの美しさは考慮してませんが。

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • micchan32
  • ベストアンサー率22% (240/1054)
回答No.2

1.ランダムな数字を発生 2.その数字を記録 3.もし過去に同じ数字があったら1に戻る 4.数字を記録 5.何回目か記録 6.10回なら終了 7.1に戻る

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。
  • mcq
  • ベストアンサー率48% (45/93)
回答No.1

方法は色々ありますが、一番簡単なのは 「今まで出てきた数字を配列に保存しておいて、まだ出ていない数字が出るまで乱数を発生し続ける」 という方法ではないでしょうか?

ocojyoemon
質問者

お礼

解答してくださった皆様にまとめてお礼申し上げます. 皆様のおかげで問題を解決することができました. 本当にありがとうございました. 今後もまたよろしくお願い申し上げます.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 乱数を扱いたい

    Active Basicでプログラムの練習をしています。 今回、乱数を扱いたいのですが、どうしても分かりません。 例えば、1~100までの整数を用意して、その中から数字をランダムで1つ取り出すっと言ったことをしたいのですが・・・・ ((例:58 など)) Rnd( )と言う関数があるようなのですが、いまいち使い方がよく分かりません。 他の関数を使用するのかも分かりません。 すみませんが、どなたか知っていましたら、ご教授願います。

  • 乱数

    乱数を発生させる際に Sub Sample() Debug.Print Int((10 - 1 + 1) * Rnd + 1) End Sub で、1から10までの乱数を発生できますが、 1から10と言う連続した数字ではなく、 例えば10,13,18,43・・・ という規則性のない複数の数字からランダムに数字を発生させるにはどうすればいいでしょうか? 10,13,18,43の中から10を返したり、18を返したりする方法を教えてください。

  • 乱数生成について

    c言語のプログラムで、1と-1をランダムにn個出力するプログラムを書きたいと思っています。どのようにすればいいでしょうか。

  • C言語 乱数

    C言語 乱数 プログラミングの宿題なのですが、よく分かりません。教えていただける方、よろしくお願いします。 ・表示する文字数の長さは12とする。 ・表示する文字は毎回ランダムで表示すること。 ・文字は英字のうち、小文字のみとする。 ・プログラムにrandom()を使うこと。 ・プログラムにsrandom()を使うこと。 よろしくお願いします。

  • 完全な乱数を生成する方法

    C言語で乱数を生成するときに、今まで srand(time(NULL)); を使用していたのですが、それだと1秒以内に複数の処理を行った際に、 同一の乱数が生成されてしまいます。 時間にとらわれずに完全にランダムな数字を出現させるにはどのような方法を取るのが簡単なのでしょうか? よろしくお願いします。

  • 乱数発生関数randomなど

    random, srandom, initstate, setstate で乱数を生成できることを知りましたが、運用方法がよくわかりません。c言語に詳しい方、for文を使って乱数を5個ほど表示させるプログラムを示してください。

  • C言語プログラム 作ってくれませんか?m(__)m

    C言語 プログラム 1~45の数字の中からランダムに15ペアの組み合わせと残りの数字を表示するようなプログラムをつくりたいのですが,どなたか作ってくれませんか? 以下のような表示例みたいなのが,嬉しいです。お願いします。 Ex. ./ random 6 -27 5 -22 4 -19 1 -21 15 -14 33 -40 17 -36 37 -28 13 -42 23 -41 34 -24 7 -35 38 -11 12 -8 26 -18 43 9 3 25 16 2 44 29 30 39 45 10 20 32 31

  • 乱数表示のプログラム

     こんにちは。C言語初心者で現在会社で勉強しているものです。上司に課題を出されました。以下の通りです。 「1~100までの数字をランダムに出力するプログラムを作成しなさい。ただし実行するたびにその結果は異なるようにし、同じ数字は表示されないようにしなさい。」  time関数を使って実行する度に異なる結果が得られるところまではできたのですが、一度表示された数字を省くロジックがわかりません。質問検索で似たような質問をされていた方が何人かいて、それを参考にやってみたのですがどうもうまくいきません。できるだけCPUに負荷をかけないように、という条件もあります。  提出期限が迫っており困っています。どなたか教えてください。

  • (初心者)乱数のことで

    使っているソフトはVisual c++です C言語で乱数を使うときにrandom関数を使ったんですが 帰ってくる値が一定なのでネットで検索したら 「メルセンヌ・ツイスタ」 を進めているサイトが多かったので ヘッダーファイルをダウンロードしてみたのですが メルセンヌ・ツイスタを プログラムに組み込む時どのように記述すればいいのか いろいろ試したのですがわかりませんでした メルセンヌ・ツイスタを組み込む構文の仕方を教えてください

  • プログラミングの乱数

    c言語、c++の乱数rand()の使い方がよくわかりません。わかりやすい説明をお願いします。 あと、プログラミングが得意な方にお願いです。 [0,1]乱数で平均と分散を求めるプログラムを配列なしで作ってください。