![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
No.6ベストアンサー
- 回答日時:
とりあえずマクロを作成してみました。
指定行の A列から HH列に条件付きの乱数を表示します。
Sub 条件付き乱数発生()
Const 行 As Long = 1
Dim データ() As Integer
Dim 個数() As Integer
Dim フラグ As Boolean
Dim 列 As Long
Randomize
Do
DoEvents
For 列 = 1 To 216
If 列 = 1 Then
フラグ = False
ReDim データ(219)
ReDim 個数(3)
データ(1) = Int(Rnd() * 3) + 1
個数(データ(1)) = 1
Else
データ(列) = Int(Rnd() * 2)
Select Case データ(列 - 1)
Case 1
If データ(列) = 0 Then
データ(列) = 2
Else
データ(列) = 3
End If
Case 2
If データ(列) = 0 Then
データ(列) = 3
End If
Case 3
If データ(列) = 0 Then
データ(列) = 2
End If
End Select
個数(データ(列)) = 個数(データ(列)) + 1
If 個数(データ(列)) > 72 Then 列 = 0
If 列 > 3 Then
If データ(列) <> データ(列 - 3) Then フラグ = True
End If
End If
Next
Loop Until フラグ
For 列 = 1 To 216
Cells(行, 列).Value = データ(列)
Next
End Sub
ご回答ありがとうございます.
作成していただいたマクロで行ってみたところ求めていたものができました.
大変助かりました.
お力を貸していただいてありがとうございました.
No.7
- 回答日時:
#5のGooUserラック さんへ
どうもありがとうございます。
おしゃった方法は、まだ、#5の内容の全部は理解していませんが、加算方式だと思います。一応、組み合わせの考え方は、そのままで、ずっと進めていました。それは、組み合わせとしては、6通りしかないからです。
>3つ目の条件チェックですが任意の2つの数または3つの数が3つごとに現れなくなった時点でクリアしたことになるのではないかと思います。
この内、1つの数が72を越えると、残りの数字は、2つですが、その内、当てはまるのは1組になります。同じものを続かせる場合は、少し違ってきます。
最後は、3つの数の1つが欠けることだから、1組(2つの数字)だけ許されるわけです。
それで、組み合わせのピースが埋まればよいのですが、ランダムはランダムゆえに、数合わせはピッタリとは行かないわけです。
>・各整数は同じ確率で出現する (1も72回,2も72回,3も72回)
ランダムで発生させると、どうやら、上記の条件に完成する確率は低いのではないかということが分かりました。
すでに改良版のコードは出来上がってはいますが、条件にはマッチしないし、乱数にこだわれば、可能性はかなり低いのではないかというところです。ジグソーパズルのように、定数から引いていく方法があるのは想像つくのですが、囲碁の持碁と同じで、みえみえに数合わせしたらだめだと思うのです。そこらへんは、今の所、私には無理なのかなって思います。
ご回答ありがとうございます.
私も初めは3つの数字の並び替えの組み合わせでやることになるのかと思っていました.
お力を貸していただいてありがとうございます.
No.5
- 回答日時:
質問者からマクロの使用しても良いかの返事が無いので、チョット面白そうな課題なのですが1歩進めません。
なので WindFaller さんへの提案みたいになってしまいますが、3つ目の条件チェックですが任意の2つの数または3つの数が3つごとに現れなくなった時点でクリアしたことになるのではないかと思います。なので考え方は次のような感じで良いのでは
①乱数で1~3の数を決める。
②それぞれの出現数をカウントして72回を超えたらクリアして ①からやり直す。
③前回の出現位置から3つ後でなければ3つ目の条件クリアのフラグを立てる。
④乱数で、1つ前の数字以外の数を決める。
⑤215回 ②~④を繰り返す。
⑥3つ目の条件クリアのフラグが立っていなかったら ①からやり直す。
No.4
- 回答日時:
スレ主さん、ちょっとトピオフすみません。
No.3 のGooUserラックさんへ
貴重なアドバイスありがとう御座います。
そのとおりですね。そうすると、3つの数の6組ではなくて、2つの数の6組になるということでしょうか。ただ、#2の場合は、必ず3つ使うから考えなくて済んだものが、そうすると、3つの数字の偏りをチェックする項目が増えるということになります。
そのまま、組み合わせを2つにして、代入させると
1- 73個 * 1 over
2- 73個 * 1 over
3 -70個 * 2 less
72個には、数が合いません。
ただし、そう大きくブレているわけではなさそうです。
最初に各数の回数72までを、カウントを減らしていくのか、増やしていくほうがよいかです。たぶん、定量なので、減らして、rnd 関数で選ばせる方法がよいのではないかと考えています。(言葉ではなんとも言えますが、実際は分かっていません)
ここの掲示板では、最後に、だいたい帳尻合わせするやり方が目立つのですが、これほどガッカリさせられる回答はないと思います。仮に結果として同じでも、それはしたくないのです。今は、頭で考えて分からないので、もう一度、VBAにまかせてみようかと思います。
>せっかく作ってもマクロはダメとか言われると思いっきり疲れるのでまだ作っていません
見る人は見ています。以前、我ながら傑作だと思ったものが、スレ主さんから、無視するなら無視してもよいのに、自分宛ての回答ではないと言われるほど、酷い返事はありません。
No.3
- 回答日時:
No.2 の WindFaller さんへ
「6組の組み合わせ」ではないと思います。以下のようなものもOKなはずなので…
1->2->1
1->3->1
2->1->2
2->3->2
3->1->3
3->2->3
なので、3つ目の条件チェックが面倒ですが2組ごとの組み合わせで考えないといけないと思います。
(偉そうに言っていますが、せっかく作ってもマクロはダメとか言われると思いっきり疲れるのでまだ作っていません)
No.2
- 回答日時:
こんばんは。
ご質問の場合は、3の並べ替えの数の6組の数字群を、隣り合わないように、組み合わせパターンを繰り返さないように、72回出力するものではないでしょうか。つまり、2重のチェック項目が必要になるわけです。
1->2->3
1->3->2
2->1->3
2->3->1
3->1->2
3->2->1
の6組の組み合わせ
関数には、以下のような器用なことはできないような気がします。
'//標準モジュール
Sub AsortedNumbers()
Dim i As Long, j As Long, k As Long, m As Long
Dim olj As Long
Dim AsrtSets(1 To 6, 0) '組み合わせセット
AsrtSets(1, 0) = Array(1, 2, 3)
AsrtSets(2, 0) = Array(1, 3, 2)
AsrtSets(3, 0) = Array(2, 1, 3)
AsrtSets(4, 0) = Array(2, 3, 1)
AsrtSets(5, 0) = Array(3, 1, 2)
AsrtSets(6, 0) = Array(3, 2, 1)
Dim arBuf As Variant '出力バッファ
Columns(1).ClearContents '1列目のクリア
Randomize '乱数のおまじない
k = 1 'スタート
olj = 0 'jの前の数字は、最初は0
For i = 1 To 216 \ 3 '3つの数字の組み合わせ回数/216は全体の回数
Do
Do
j = Int(Rnd() * 6) + 1
Loop While olj = j '前の組み合わせセットを出さない
If i = 1 Then
arBuf = AsrtSets(j, 0)
Exit Do
End If
arBuf = AsrtSets(j, 0)
DoEvents '万が一の暴走を止める
Loop Until arBuf(0) <> Cells(k - 1, 1).Value '前セットの後尾と重ならない
Cells(k, 1).Resize(3).Value = Application.Transpose(arBuf)
k = k + 3
olj = j 'jを繰り返すことないようにする
Next
End Sub
'//
私なりのアイデアなのですが、いかがでしょうか?
もっと単純に書く人はいらっしゃるとは思います。
216という数は安全圏内ですが、それ以上の極端な数は未知、つまりいづれは出来上がるかもしれませんが、いつになるのか分からないということです。そのためのDoEventsで、メモリを全部使いきらないための命令です。専門的になりますが、その時は、固定の乱数パレットが必要になるのだろうと思います。
No.1
- 回答日時:
ある意味乱数ではないですよね。
また単純ではないので関数では多分無理でしょう。プログラム的なものが必要なのでマクロ(VBA)などを使い②の条件の物を何度か作成して①や③の条件に当てはまらなければ自動で作り直す感じになるのだと思いますがそれでも良いのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 [x] は,正の整数xの正の約数の個数を表すものとする。 例えば, 12の正の約数は 1, 2, 3 4 2022/08/01 11:20
- 数学 確率の問題です。 5 2022/12/20 19:18
- 統計学 確率統計の問題です。 3 2022/04/07 04:39
- 中学校 中3数学問題 解答見てもわかりません 2 2022/06/26 14:21
- Visual Basic(VBA) エクセルで特定のセルのみを任意のタイミングで更新する方法 1 2023/06/23 21:23
- 数学 教えてください。 2 2022/06/30 14:26
- 統計学 確率統計です。赤玉が 3 個、白玉が 7 個入った袋がある。 3 2022/05/07 08:36
- 数学 大学数学 「条件:t進表現において、何乗しても右から2桁が変わらない2桁の自然数が存在する。」 上記 7 2023/06/28 22:25
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- 数学 どうか教えてください。 4 2022/07/02 20:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
-
LEFT関数とIF関数の組み合わせ...
-
VLOOKUPの列番号の最大は?
-
エクセルマクロPrivate Subを複...
-
VBAで別ブックの列を検索し、該...
-
エクセルのソートで、数字より...
-
【再投稿】【マクロ】元データ...
-
列方向、行方向の定義
-
Excelの行数、列数を増やしたい...
-
VBA 指定した列にある日時デー...
-
リストからデータを紐付けしたい
-
Alt+Shift+↑を一括で行うには、...
-
【マクロ】【VBA】条件付き書式...
-
横軸を日付・時間とするグラフ化
-
ListViewで列を指定して表示さ...
-
(VBA)Excelの特定の範囲にデー...
-
エクセルのシートの大きさを変える
-
【Excel VBA】セルで列番号を指...
-
位置の違う列のデータを項目ご...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
-
VLOOKUPの列番号の最大は?
-
LEFT関数とIF関数の組み合わせ...
-
VBA 指定した列にある日時デー...
-
Alt+Shift+↑を一括で行うには、...
-
エクセルで住所を県と市・郡と...
-
エクセルで複数列の検索をマク...
-
Excelの行数、列数を増やしたい...
-
VBAで結合セルを転記する法を教...
-
エクセルマクロの組み方
-
エクセルマクロPrivate Subを複...
-
CSVファイルの「0落ち」にVBA
-
列方向、行方向の定義
-
リストからデータを紐付けしたい
-
エクセルのソートで、数字より...
-
Excel文字列一括変換
-
エクセルで最初の行や列を開け...
-
エクセルでセル12個間隔で合...
-
エクセル マクロ 範囲指定で...
おすすめ情報