• ベストアンサー

Excel で、乱数時のでてくる数字、0から9の数の比率をほぼ同じにする方法

Excel で、乱数時のでてくる数字(けた数が多い時も含め)、0から9のでてきた数字の比率を計算する方法と、その比率をほぼ同じにする方法はありますでしょうか。

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

  • ベストアンサー
  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.6

#5です。 前期の方法は、各桁中の数字の比率も同じに・・・、と誤解して書いていました。ので、訂正します。 ただ、乱数を出しながら比率を合わせていくよりも、最初から希望する比率分の数字を決めた方が効率的だと思います。たとえば、よくきったトランプを4枚ずつ並べると4桁の乱数みたいになります。この方式でマクロを書きました。 セル範囲A1:A10に、0から9を入れます。 セル範囲をオートフィルで右へ必要な桁数だけコピーします。例えばH列までコピーすると8桁の数字が出来ます。下記のマクロを実行するとシャッフルされた表と、表を変換した数字が出来上がります。 このマクロはA1にかかる表を、その列数の桁の数字に変換します。左端に0がでた場合は、乱数を元に位置を変えますので、出来上がる数字の桁は必ず揃います。8桁の数字が100個欲しい場合は、上記の例のものを9個下へコピーしてからマクロを実行すればいいわけです。 # 元になる表中に空白のセルがあると、そのセルの値は0とみなされます。表の周囲のセルには何も記入しないでください。同じ数字が複数できたかどうかのチェックはしていません。 # ご質問の趣旨を逸脱した内容ですみません。余計なお世話かな~と思いながら、ボケ防止のために書いております。 Sub Shuffle2() Dim myRange As Range, c As Range, rC As Integer, cC As Byte Dim Rv As Byte, i As Integer, n As Integer, lC As Currency Dim k() As Byte, d As Currency With Range("A1").CurrentRegion rC = .Rows.Count cC = .Columns.Count lC = .Cells.Count Set myRange = .Offset(0, cC + 1) myRange.Value = .Value End With ReDim k(lC) For Each c In myRange i = i + 1 k(i) = c.Value Next c Do i = Int((lC - 1 + 1) * Rnd + 1) n = Int((lC - 1 + 1) * Rnd + 1) Rv = k(i) k(i) = k(n) k(n) = Rv d = d + 1 Loop Until d = lC * 300 i = 0 For Each c In myRange i = i + 1 c.Value = k(i) Next c If cC = 1 Then Exit Sub With Application.WorksheetFunction Do While .CountIf(myRange.Columns(1), 0) > 0 i = .Match(0, myRange.Columns(1), 0) If .CountIf(myRange.Rows(i), 0) = cC Then MsgBox "0 が出来てしまいました、途中ですが終了します。" Exit Sub End If Set c = .Index(myRange, i, Int((cC - 1 + 1) * Rnd + 1)) myRange.Columns(1).Rows(i).Value = c.Value c.Value = 0 Loop End With i = 0 Do n = cC i = i + 1 d = 1 lC = 0 Do lC = lC + myRange.Rows(i).Columns(n).Value * d d = d * 10 n = n - 1 Loop Until n = 0 myRange.Rows(i).Columns(cC + 1).Value = lC Loop Until i = rC Columns(cC * 2 + 2).NumberFormatLocal = "_ * #,##0_ ;_ * -#,##0_ ;_ * ""-""_ ;_ @_ " End Sub

taka508
質問者

お礼

本当に、ご丁寧に解説していただきありがとうございます。

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

その他の回答 (5)

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.5

出てきた乱数を調節するよりも、最初から比率を決めて作ってみてはいかがでしょう。そうすれば、完全に同じ比率のものが作れます。 まず、最初の1行を乱数で作ります。それから A B C D E F G ・ J 3 8 4 1 5 0 2 ・ 6 4 9 5 2 6 1 3 ・ 7 5 0 6 3 7 2 4 ・ 8 6 1 7 4 8 3 5 ・ 9 7 2 8 5 9 4 6 ・ 0 8 3 9 6 0 3 7 ・ 1 のように列方向で、一つずつずらした数字を10行まで入れます。 こうしてできは表は、どの列や行でも0~9の数字が一つずつ入っています。 これを列だけで数回シャッフルします。 さらに行だけで数回シャッフルします。 シャッフルする回数が多ければ乱数らしくなってきます。 シャッフルでは、1行(列)の中で数字が移動するだけですから、1行(列)の中の0~9の個数は変わりません。 沢山必要な場合は以上を1セットとして、最初の行の乱数を変えながら複数のセットを作ります。 出来上がった表に"味付け"として、後から所々の数字を変えてみてはいかがでしょう。完璧な乱数とは言えませんが、珠算の問題としては十分ではないでしょうか。 マクロを書こうかとも思うのですが、このところ忙しくて・・・。 来週中に回答が無かったら、あきらめてください。m(__)m

taka508
質問者

補足

なるほど、このような方法もあるのですね。ありがとうございます。とても、参考になりました。

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

No.1のymmasayanです。補足にお答えします。 >目的は、珠算の問題作成のためです。 >数字の比率の確認と、比率の調整が必要になるのです。 >もし、いい方法がありましたら、教えてください。 目的はわかりました。 ということは、n桁の数も0~9の数字も両方とも乱数でないといけないということですね。 両立させるのは結構難しいですね。優先するのは数字の方のようですね。 乱数は作る数が少ないときは必ず偏ります。大量に作ると比率が安定します。 No.3の方もおっしゃっていますが2000くらい作ってやっと安定するということです。 この中から少しだけ切り出して使うとすると、やっぱり偏ってしまいます。 切り出す範囲が狭くても0~9の比率が安定する方法として、カードを使う 方法があります。 0~9を例えば4枚づつ作り、これをシャッフルして1枚づつ引いて記録していきます。 なくなると又シャッフルして・・・。 これをプログラムにすればいいのですが結構面倒です。 適切な回答になっていませんが参考にしてください。

taka508
質問者

お礼

ありがとうございます。 大変そうですね。

すると、全ての回答が全文表示されます。
  • nihonjinn
  • ベストアンサー率39% (79/200)
回答No.3

=ROUNDDOWN(RAND()*10,0) で0から9までの乱数を発生させます。 好きな数だけSheet1のセルに数式をコピーします。 Ctrl+AでSheet1全体を選択し、名前ボックスで「乱数」とでも名前をつけておきます。 Sheet2でA1からA10に0から9までの数字を入れておき、B列に =COUNTIF(乱数,A1)/COUNT(乱数) と入れて各数字の比率を出します。 比率をほぼ同じにする方法としては、例えば比率のばらつきが0.09~0.11まで良しとすると =IF(SUMPRODUCT((B1:B10>=0.09)*(B1:B10<=0.11))=10,"○","×") と入れてF9キーを連打して○が出るまで再計算していきます。 この条件だとサンプルが2000以上無いと○が出てきませんでした。

taka508
質問者

お礼

本当に、いい方法を教えていただきありがとうございます。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

>数字の比率を計算する方法 プログラムを組まないと出来ないでしょう。CharacterCountといったような関数は見たことがないです。 プログラムでは多桁の数字の各桁を取り出して0から9までの配列を用意して、出現の都度、その数字の配列値に+1すれば良いので、そう難しいものではないと予想します。 >その比率をほぼ同じにする方法 出現数のほかに出現順序もそろばんをおく早さ・容易さに関係してくるのではないですか。そもそも乱数は、無限大回数試行しての偏りなしなので、ミクロでは比率の同じは保証されないでしょう。敢えて弄くると乱数性がそこなわれるかと。同じ数の数字のセットを用意して、拾ってゆく、一度拾った数字は次ぎから除外する、その時拾う順序を乱数化するなんて、素人で思いますが、やはりプログラムを組まないと出来ないでしょう。 数学的背景を説明してくれる人が出るといいのですが、出ても質問者向けに説明が難しいのでは。

taka508
質問者

お礼

ありがとうございます。 なかなか、難しそうですね。

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

数えることは可能としても、比率を同じにするように変えることは出来ませんから 何のためにという気ががします。 計算機で出す乱数は擬似乱数といって本物の乱数に比べて若干偏りがあるかも 知れません。でもみんな平気で使っています。他にないから。

taka508
質問者

補足

目的は、珠算の問題作成のためです。珠算の問題は、数字の比率の統一があり、でてきた、数字を手作業でカウントしています。その関係で、数字の比率の確認と、比率の調整が必要になるのです。 もし、いい方法がありましたら、教えてください。

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

関連するQ&A