プロが教えるわが家の防犯対策術!

ロト7の組み合わせをExcelでランダムの数字で抽出する方法

ロト7の組み合わせ 1~37までの数字から7つの数字を選ぶ。

それを100通り作りたいんですが、マクロのプログラムを教えてください。
100通りの組み合わせはすべて異なる組み合わせにしたいです。

よろしくお願いします。

A 回答 (4件)

#2です



> そのままマクロを作成してもコンパイルエラー 構文エラーが出ます。

ずっと考えていたのですが、何故エラーになったのかわかりません

新規ファイルを開いて、
標準モジュールに、コピー&貼り付けして、
Samp1 を実行すると、アクティブなシートに結果が表示されると思います


※ 本質問は、必勝法?についてのものになりますか?

>  Const CNUM As Long = 37 ' 1 ~
>  Const CCNT As Long = 7 ' 個数

この部分

  Const CNUM As Long = 42 ' 1 ~
  Const CCNT As Long = 6 ' 個数

にすれば、1 ~ 42 から 6 つランダム抽出します
ロト 云々とは直接関係ないものとして回答していました


※ 以下の条件は、条件ではなかったのですね

> 1~37までの数字から7つの数字を選ぶ
> 100通りの組み合わせはすべて異なる組み合わせにしたい
    • good
    • 0

#1の回答者です。



私も未熟です。
単に、Excelの標準モジュールを挿入して、全部をコピーして、そこに貼り付けてください、というぐらいしかありません。それ以上は、私は分かりません。

>End Subのあとのプラグラムの意味もよくわかりません。
並べ替えをするための別のプログラムです。汎用性があるので、別になっています。

何も程度の低いExcelよりも、Vector等で適当なツールを探してもよろしいかと思います。それ自体は、ワークシートの関数でも可能ですが、ワークシートの関数のRAND()の性能は、すこぶる悪いので、想像以上に並びに偏りが出るのではないかと思います。(OSに別の、擬似乱数発生ジェネレータを入れれば高性能にすることはできるでしょうけれども。)

私が、#1で書いたように、ロトの理論(例:ゲイル理論)というものは存在するようですし、それで数年は生活できる人がいると豪語しているようで、本当は、その理論のほうが価値があるような気がします。

http://happyloto.ciao.jp/contents/basic/gail_rir …

私が#1の添付画像で示したのは、どこかのサイトで紹介された理論で作られたもので、当然、インターネットで、ミズホ銀行の当選番号案内で一定期間のデータを取って、上中下と3つに区切り、その3つの中の並び替えをして、当たりクジを探すというものです。掲示板では公開はするつもりはありませんが、お金を掛けるゲーム性が強いものですから、それなりに、ご自身で勉強することを望みます。

ロト6の神様 最強のゲイル理論
http://amazon.co.jp/dp/4895955559
    • good
    • 0
この回答へのお礼

回答をいただき有り難うございます。
ごもっとな話です。そうしたいと思います。

お礼日時:2016/05/15 06:23

以下でどうでしょう



標準モジュールに記述して Samp1 実行すると
アクティブシートに結果が表示されます
Const 部分を変更すれば・・・・


Public Sub Samp1()
  Const CNUM As Long = 37 ' 1 ~
  Const CCNT As Long = 7 ' 個数
  Const CPTN As Long = 100 ' 結果行数
  Dim dic As Object
  Dim vA As Variant
  Dim iA(1 To CNUM) As Long
  Dim i As Long, j As Long, k As Long

  Set dic = CreateObject("Scripting.Dictionary")

  Randomize
  While (dic.Count < CPTN)
    ReDim vA(1 To CNUM)
    For i = 1 To CNUM
      iA(i) = i
    Next
    For i = 0 To CCNT - 1
      k = CNUM - i
      j = Int(k * Rnd()) + 1
      vA(iA(j)) = iA(j)
      iA(j) = iA(k)
    Next
    dic(Join(vA, ",")) = Empty
  Wend

  Application.ScreenUpdating = False
  Cells.Delete
  With Range("A1").Resize(dic.Count)
    .Value = WorksheetFunction.Transpose(dic.Keys)
    .TextToColumns .Cells(1), xlDelimited _
      , ConsecutiveDelimiter:=True, Comma:=True
    On Error Resume Next
    .SpecialCells(xlCellTypeBlanks).Delete xlShiftToLeft
    On Error GoTo 0
    With .CurrentRegion
      For j = .Columns.Count To 1 Step -1
        .Sort .Cells(j), xlAscending, Header:=xlNo
      Next
    End With
  End With
  Application.ScreenUpdating = True

  Set dic = Nothing
End Sub
    • good
    • 0
この回答へのお礼

早速回答を頂きましてありがとうございます。
Const 部分を変更すれば・・・・
私の未熟さ故どう変更すればいいのかわかりません。
そのままマクロを作成してもコンパイルエラー 構文エラーが出ます。
未熟な私に理解できるようお願いします。

お礼日時:2016/05/14 07:20

これは、昔、Microsoft Officeの日本の宣伝で、大学生のお兄ちゃんは、Office のExcelでロト7の数字も作れるというようなことを書いていました。

結構、のせられた人もいたのではないでしょうか。マイクロソフトも罪なことをしますね。

でも、その頃、私も挑戦したことがあります。それは、添付画像にその頃の残骸がありますから、ご覧ください。インターネットで、あたり番号の統計を取って、その傾向から次を予測するというものです。
 [100通りの組み合わせはすべて異なる組み合わせ]
そのままの組み合わせを出そうとしたら、PCのスペックが越えてしまいます。

もちろん、ご質問そのものは、Excelを良く知っている人なら作れますし、それは以下のような簡単なマクロでできます。もしかしたら、マクロのおかしい部分があるかもしれませんが、数字は取れるはずです。

私が作成した時は、統計を用いる方法があるのですが、だいたい、1年間のデータ(2年以上だと狂う)を使って、その順位の傾向を測るという、「傾向の高い数は再びでる」という原則を用いたものですが、それでも、面白いものが出来ました。中には、そういう方式で、数年間は、それだけで生活できた人がいるというのだから、おどろきです。(なにか、眉唾のような気がしますが……。)ということで、

人に聞くのではなくて、ご質問者自身でも研究なさってみたらいかがですか?いくつかの理論があるそうです。(作る方が面白いですよ。添付画像はミニロト版です。実際に購入したことはありません)理屈はすごいです。もし、これで生活できるほどの的中率なら、公開などしませんね。(^^;

最初は、関数で作ろうとしたけれども、Excelが動かなくなってしまいました。でも、こんなに面白いものは、他にはありません。

以下は、やってみると、順位にはばらつきがあるようです。1行目は、順番を1~37を入れるようにしています。

擬似乱数発生ジェネレーター(一様乱数)の関係で、途中で止めたら、その全部の数字は使えなくなるので、1回、100個なら100個全部を出力してください。
書き出しは、"A2:AK101"を使います。

これは、ロト7用です。
'//
Sub LotNumCreate()
  Dim nums(1 To 37, 1 To 2)
  Dim nums2 As Variant
  Dim i As Long, j As Long, k As Long
  Dim cnt As Long: cnt = 1
  k = 2
  'データがあればクリア
  ActiveSheet.Range("A2:AK101").ClearContents
  '注意:一様乱数は途中で止めたら、乱数でなくなります!
  Randomize
  Do
    For i = 1 To 37
      nums(i, 1) = Rnd()
      nums(i, 2) = i
    Next
    nums2 = MakingPos(nums)
    Application.ScreenUpdating = False
    For j = 1 To 37
      Cells(k, j).Value = nums(j, 2)
      DoEvents
    Next j
    Application.ScreenUpdating = True
    k = k + 1
    cnt = cnt + 1
  Loop Until cnt > 100
  
End Sub

Function MakingPos(dArray)
  Dim i As Long
  Dim j As Long
  Dim buf As Double, buf2 As Long
  If Not IsArray(dArray) Then Exit Function
  For i = UBound(dArray) To LBound(dArray) Step -1
    For j = LBound(dArray) + 1 To i
      If dArray(j - 1, 1) > dArray(j, 1) Then
        buf = dArray(j - 1, 1)
        buf2 = dArray(j - 1, 2)
        dArray(j - 1, 1) = dArray(j, 1)
        dArray(j - 1, 2) = dArray(j, 2)
        dArray(j, 1) = buf
        dArray(j, 2) = buf2
      End If
    Next j
  Next i
  MakingPos = dArray
End Function
'//
以下は、ミニロトのサンプル画像で、本件とは直接関係がありません。
「ロト7の組み合わせをExcelでランダム」の回答画像1
    • good
    • 1
この回答へのお礼

せっかくご回答を頂きましたが私の未熟さのため理解できません。
プログラムをそのままマクロにコピーしてもコンパイルエラー(構文エラー)がでます。また、End Subのあとのプラグラムの意味もよくわかりません。

お礼日時:2016/05/14 07:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!