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
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
No.4
- 回答日時:
No.1のymmasayanです。
補足にお答えします。>目的は、珠算の問題作成のためです。
>数字の比率の確認と、比率の調整が必要になるのです。
>もし、いい方法がありましたら、教えてください。
目的はわかりました。
ということは、n桁の数も0~9の数字も両方とも乱数でないといけないということですね。
両立させるのは結構難しいですね。優先するのは数字の方のようですね。
乱数は作る数が少ないときは必ず偏ります。大量に作ると比率が安定します。
No.3の方もおっしゃっていますが2000くらい作ってやっと安定するということです。
この中から少しだけ切り出して使うとすると、やっぱり偏ってしまいます。
切り出す範囲が狭くても0~9の比率が安定する方法として、カードを使う
方法があります。
0~9を例えば4枚づつ作り、これをシャッフルして1枚づつ引いて記録していきます。
なくなると又シャッフルして・・・。
これをプログラムにすればいいのですが結構面倒です。
適切な回答になっていませんが参考にしてください。
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以上無いと○が出てきませんでした。
No.2
- 回答日時:
>数字の比率を計算する方法
プログラムを組まないと出来ないでしょう。CharacterCountといったような関数は見たことがないです。
プログラムでは多桁の数字の各桁を取り出して0から9までの配列を用意して、出現の都度、その数字の配列値に+1すれば良いので、そう難しいものではないと予想します。
>その比率をほぼ同じにする方法
出現数のほかに出現順序もそろばんをおく早さ・容易さに関係してくるのではないですか。そもそも乱数は、無限大回数試行しての偏りなしなので、ミクロでは比率の同じは保証されないでしょう。敢えて弄くると乱数性がそこなわれるかと。同じ数の数字のセットを用意して、拾ってゆく、一度拾った数字は次ぎから除外する、その時拾う順序を乱数化するなんて、素人で思いますが、やはりプログラムを組まないと出来ないでしょう。
数学的背景を説明してくれる人が出るといいのですが、出ても質問者向けに説明が難しいのでは。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 2つのテキストファイルを比べて文字列を特定する方法を教えて下さい 5 2022/05/01 15:22
- 数学 画素数の計算 中高レベルの計算で申し訳ないのですが、下記の問題が分かりません 比率が4:3のA4の横 3 2022/12/17 22:41
- Excel(エクセル) Excelの数字(文字列)合計について あるデータをダウンロードすると、数字データが全て文字列になっ 4 2022/09/26 21:21
- 財務・会計・経理 3000万融資を受けたとします。 年率1.475%、13回でお支払いする場合毎月の利息の計算方法を教 4 2023/06/20 19:39
- Excel(エクセル) Excel 効率的な名簿と得点の管理の仕方 8 2022/08/07 08:15
- Excel(エクセル) Excelで任意の塗りつぶし色の数字を集計する方法はありますか?関数を使ってできる方法があれば教えて 3 2022/11/18 16:57
- その他(ギャンブル) なぜ数字や確率に強い人がギャンブルをするのでしょうか? 5 2022/07/26 23:08
- 数学 なぜ数字や理系に強い人がギャンブルをするのでしょうか? 4 2022/07/26 23:46
- Excel(エクセル) Excelで任意の塗りつぶし色の数字を集計する方法はありますか? 3 2022/11/09 06:48
- 数学 時々、回答者の見識に疑念を抱いてしまうんです。私だって本当は皆様のことを疑いたくはありません。しかし 2 2022/11/27 12:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで2つの数値のうち大きい...
-
エクセルで、2種類のデータを...
-
エクセルに入力した文字列に句...
-
Excelで中央揃えが出来ない?
-
エクセルで特定の文字が入って...
-
excelで、1つのセルに入ってい...
-
Excel 頭に「0」がついている...
-
【EXCEL】別シートに同じ番号が...
-
ある列のセルに特定の文字が入...
-
Excel 指定行までコピーをおこ...
-
Excelでグループの最大値から項...
-
Excelのデータ間引きについて
-
セル内文章から、英数字のみ取...
-
エクセルで、数字列の中にハイ...
-
セルを結合する場合に・・・
-
Excel2013 カラースケールを別...
-
Excelでセルの高さを保ったまま...
-
桁の違う数値での並び替え
-
excel: 2行ずつ間隔を空けて関...
-
VLOOKUPのあいまい検索(スペー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで2つの数値のうち大きい...
-
エクセルで、2種類のデータを...
-
ある列のセルに特定の文字が入...
-
Excelで中央揃えが出来ない?
-
エクセルで特定の文字が入って...
-
セル内文章から、英数字のみ取...
-
Excel 頭に「0」がついている...
-
エクセルのまとめてカッコをつ...
-
桁の違う数値での並び替え
-
エクセルに入力した文字列に句...
-
Excel強制終了
-
Excel 指定行までコピーをおこ...
-
Excelの結合でA列とB列の内容...
-
excelで、1つのセルに入ってい...
-
エクセルで、数字列の中にハイ...
-
連続データを1行おきに貼り付け...
-
エクセルの関数
-
【エクセル】2行に一行のように...
-
WEEKDAY 空白も7になってしまう
-
VLOOKUPのあいまい検索(スペー...
おすすめ情報