• 締切済み

条件付Excel乱数の作成について

次のような形の表に以下の条件にあった乱数を作成したいと思っています。 A列 問題番号(No.1~50) B列 正解数 (1または2) C列 選択肢の数 D列 正解番号 ※ここに乱数で以下の条件に合う数式を入れたい <条件> ・列方向で見たとき、は同じ正解番号が3回以上続かないようにしたい (例:2,2,2・・・というのはNG) ・同じ正解番号が14個以上発生しないようにしたい(MAX50問くらいです) ・選択肢の数が複数の場合は「n,n」と同一セルに表示されるようにしたい。  (難しい場合は隣の列でも可) 現在、正解番号列に「=INT(RAND()*(選択肢の数)+1)」と入れるところで停滞してしまっています。 VBA等、いろいろネットで調べたのですが、具体的な解決に繋がるものがなくこちらに駆け込みました。 どうぞお知恵を貸して下さい。 よろしくお願い致します。

みんなの回答

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.2

問題の選択肢をランダムに入れ替えるということですよね。 まず選択肢の数は4か5で固定してください。 そうでなければ他の条件を満たすことは不可能です。 例として選択肢が3と5の問題がある場合、選択肢が5の答えは4か5に偏ることになります。 選択肢数を固定として作ることが可能なVBAは2通りあり 正解数を1に固定するか、14個以上の正解があるのはOKのどちらかになります。 正解数が1に固定の場合なら、50問分の正解パターンを用意して それをランダムで選ぶ方式が考えられます。 QA(1)="12334324245323323223323423424" QA(2)="12325432235423424353224233223" のように200パターン位用意してこれを各問題の正解番号にセットする 逆に正解数を1or2で問題ごとに変えるなら、 3回以上続かないのと14個以上同じ正解番号がないは難しいです。 3回以上続かないのは条件に合致するまでLoopさせれば不可能ではないですが 14個以上同じ正解番号がない条件を加えると全体の番号を割り当ててから個数を確認して NGならやり直しとなり無限ループに近い計算となりCPUに負荷がかかります。 正解数を1or2とする場合は少なくとも14個以上同じ正解番号がない条件は外してください。 上記の条件でよければVBAを組んでみますけど...

ko_kawauso
質問者

補足

回答ありがとうございます。 条件を全て満たすのは難しいのですね。 >正解数を1or2とする場合は少なくとも14個以上同じ正解番号がない条件は外してください。 >上記の条件でよければVBAを組んでみますけど... 正解数を1or2にする方を優先したいので、参考にさせて頂けますか? 文字数がオーバーする場合は、条件設定の部分だけでも結構です。 よろしくお願い致します。

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

正解番号は、乱数関数を含む数式で求めてはいけません。 >同じ正解番号が3回以上続かない >同じ正解番号が14個以上発生しない という条件を判定する為に、一度、そのセルに正解番号が入れられたら、2度と値が変わってはいけません。 しかし >=INT(RAND()*(選択肢の数)+1) のような乱数関数を含む数式を書くと「評価するたびに、正解が変化してしまう」ので、条件を正しく判定できません。 例えば、以下のような事が起きます。 1問目の回答が乱数で「2」になりました。 2問目の回答が乱数で「2」になりました。 3問目で、乱数が「2」になったので、1問目と2問目の回答が「2」かどうか調べました。すると1問目と2問目の式が再評価され、それぞれ新しい乱数で「1」と「3」が返って来て「2が3つ連続してないから大丈夫」と判断され、回答が「2」になりました。 ここで「最初に求めた値を採用する」と、3問連続で「2」が出てしまいます。 つまり「乱数関数は、番号を最初に新規に作る時だけ使用し、番号を再評価する場合は、最初に作られた値が返って来る」ようにしないとなりません。 言い換えれば「数式では無理。マクロを組むか、VBコードで書く必要がある」という事。 例えば、シート上に「回答成作」のコマンドボタンを置き、ボタンを押したらVBコードが呼び出され、正解番号列のセルに「乱数で作られた、正解番号を表す文字列」を書き込んで行くとか。 なお「正解が2個あるとき」に「1,2」とか「1,3」とか「2,5」とかにならないといけないので、正解番号列は「文字列」になっていなければなりません。 数式で書くのは「理論的に不可能」なので、今すぐVBコードの参考書を買って来ましょう。 因みに「VBのコードは、ここの解答欄の文字数では、どうやっても書き切れないくらいの文字数」になるので、回答不可能です。

ko_kawauso
質問者

お礼

回答ありがとうございます。 乱数の特性を理解していなかったので大変勉強になりました。 ご丁寧な解説、助かりました。 >例えば、シート上に「回答成作」のコマンドボタンを置き、ボタンを押したらVBコードが呼び出され、正解番号列のセルに「乱数で作られた、正解番号を表す文字列」を書き込んで行くとか。 なるほど!こちらのヒントを頂けただけでも質問させて頂いた収穫がありました。 VB初心者ですが、もう少し試行錯誤してみます。

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

関連するQ&A

  • 乱数の最大値

    C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • 乱数について(C言語)

    C言語において,乱数の範囲を 0 ≦ r < 1 とする場合には double r=(double)rand()/(RAND_MAX+1); とするのは知っているのですが0 < r ≦ 1にする場合の方法がわからず困っています. アドバイスいただきたいです.

  • 大きな数の乱数を作るには

    C 初心者です。 表題のように、unsigned longのスケールの乱数をつくりたいんですが、以下のように記述すると値がいつも同じになります。この理由と、正しく動作するにはどう直したらいいのか教えてください。 unsigned long ul; ul = 4294967295UL * rand() / (RAND_MAX + 1); 値は常に131071でした。

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • Excel当番を条件付きで乱数で設定する方法

    とあるパトロールに担当する人の割り振りをします。 メンバーから乱数で当番を割り振りをしたいのですが、複数条件がある場合どのような数式を入れるのでしょうか。 条件は以下の通りです。 (1) 一度巡回したら3日空けて割り振りをする(連続または3日以内にパトロールに割り振るのを避けたい) (2) 同じ部署同士でのパトロール・リーダー同士でのパトロールを避けたい (3) 乱数で割り振りをした後にリーダーがパトロール1になるようにしたい(リーダーでない人が一番上になるのを避けたい) (4) 先月パトロールした回数が3回の人は2回になるように割り振りたい。 乱数で当番を割り振る方法はインターネットの文献で拝見したのですが、条件付きで割り振る場合、どうすれば良いか悩んでいます。 担当者の個々人のスケジュールを一人ずつ確認し、割り振りをしていましたが時間をかなり要してしまい、効率化を図りたいと思い質問させて頂きました。 詳しい方いましたらご教授ください。 よろしくお願いいたします。

  • エクセル 任意の数字から始まる重複しない乱数

    お世話になります。 エクセル2003/XP 使用です。 RANK関数またはそれに似た利用方法でご教授願いします。 下記ページを参考に、"重複しない乱数”を作成しました。 http://www.relief.jp/itnote/archives/001798.php (ページ中程、▼操作手順:重複しない乱数を作成する 以下の部分) 乱数の最初の数字が1から始まる分には問題なくできるのですが、 乱数の数字を、「任意の数字から始めて」、 「任意の数字で終わる」ようにすることは可能でしょうか? 例えば、下記の例でいうと、 6から始まり10で終わる乱数です。        A列     B列 1行目 / =RAND() / 1-5の範囲でランダムな重複しない乱数 2行目 / =RAND() / 同上 3行目 / =RAND() / 同上 4行目 / =RAND() / 同上 5行目 / =RAND() / 同上 ------------------------------------------------------------ 6行目 / =RAND() / 6-10の範囲でランダムな重複しない乱数 7行目 / =RAND() / 同上 8行目 / =RAND() / 同上 9行目 / =RAND() / 同上 10行目 / =RAND() /同上 (11以下、繰り返し 略) よろしくお願いします。

  • 条件付書式

    エクセルで条件付書式を数式で入力しています。 =COUNTIF(N26:BK50,A82) 例えば上記のような形で入力を行なっていますが このN26:BK50の中で赤色の文字だけに 条件付書式を当てはめる事はできないでしょうか? どなたか分かる方宜しくお願いします。 どうしても数ある同じ文字列の中で赤色のA82だけを捜してきたいのですが・・・

  • MATLABの乱数生成関数 rand( ) について

    一様乱数を生成する関数rand()について  ・Y = rand(n);  ・rand('state',sum(100*clock));   Y = rand(n); という2つのやり方があるようなのですが,以下のmatlabの関数の説明 のページをみても2つの違いが理解できません. http://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/rand.html どういう違いがあるのでしょうか? また,この関数は[0,1]の一様乱数としていますが,[-a,a]みたいに範囲指定はできないのでしょうか? 回答よろしくお願いします.

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

専門家に質問してみよう