■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#17003-0ランダム関数mi-ko2001-07-25(水) 14:28
     #17004-0RE#17003:ランダム関数匿名170042001-07-25(水) 14:58
     #17005-0RE#17003:ランダム関数たなか2001-07-25(水) 15:07
     #17007-0RE#17003:ランダム関数よねKEN2001-07-25(水) 15:10
     #17012-0RE#17003:ランダム関数Say2001-07-25(水) 18:30
#17003-0
ランダム関数
こんにちは、お世話になります。

VBで4桁の乱数を発生させたいのです。
聞くところによると、rand関数はなぜかランダムではない
という話を聞きました。(その理由も知っている方がいらっしゃいましたら
教えてください)
そもそも、VBに関数があるのでしょうか?

以上、よろしくお願いします。
#17004-0
RE#17003:ランダム関数
> VBで4桁の乱数を発生させたいのです。
> 聞くところによると、rand関数はなぜかランダムではない
> という話を聞きました。(その理由も知っている方がいらっしゃいましたら
> 教えてください)

Randomize を使えば OK

> そもそも、VBに関数があるのでしょうか?

n = Int(Rnd * 9000) + 1000
#17005-0
RE#17003:ランダム関数
ランダムでない理由は知りませんが、Randomizeを使えばバラバラになりますよ

4桁のランダム値は
ret = Int(Rnd * 9000) + 1000
でよろしいかと…
#17007-0
RE#17003:ランダム関数
> VBで4桁の乱数を発生させたいのです。

こんな感じでどうでしょう。

Private Sub Form_Load()
    Dim i As Long
    Dim result(100) As Long
    Dim L As Long
    
    Randomize
    
    For i = 0 To 1000000
        L = Int(Rnd * 9000) + 1000
        result(L \ 100) = result(L \ 100) + 1
    Next
    
    ' 例:reault(10)は1000〜1999の値の数です。
    For i = 10 To 99
        Debug.Print result(i)
    Next
End Sub

乱数の分布のチェック付きです。

> 聞くところによると、rand関数はなぜかランダムではない

Rnd関数ですね。

> という話を聞きました。(その理由も知っている方がいらっしゃいましたら
> 教えてください)

どういう観点でランダムではないという意見があるのかがわからないので
なんとも言えません。

Rnd関数はそれなりに真っ当な乱数を生成していると思いますが。

ただし、Rnd関数をベースに計算した値を使用するので、
計算式によっては、乱数が片寄る場合はあります。
#17012-0
RE#17003:ランダム関数
残念ながら、完全に不規則な数列を「計算で」求めることはできません。
VBに限らず、乱数関数によって作られる「乱数」は、実は循環周期のきわめて長い
循環数列です、いわゆる擬似乱数です。
乱数を作るアルゴリズムでしたら、線形合同法あたりが有名です。

せっかくですから、VBの乱数が規則的であるところを視覚的にお見せしましょう。

Formにボタン2つおいてください。
下記コードをコピーして実行します。
Command1をおしたら、点をばらまきますが、
Command2をおせば、あーらふしぎ・・・(やってのお楽しみ)
rndは15桁の擬似乱数を作りますが、下位の桁ほど循環間隔が小さくなります。

Private Sub Command1_Click()
    Dim lngX As Long
    Dim lngY As Long
    Dim i As Long

    For i = 1 To 10000
        lngX = Int(Rnd * 4096)
        lngY = Int(Rnd * 4096)
        Form1.PSet (lngX, lngY), RGB(255, 255, 255)
    Next
End Sub

Private Sub Command2_Click()
    Dim lngX As Long
    Dim lngY As Long
    Dim strX As String
    Dim strY As String
    Dim i As Long

    For i = 1 To 10000
        strX = Format(Rnd * 1E+15, "000000000000000")
        strY = Format(Rnd * 1E+15, "000000000000000")
        strX = Right(strX, 4)
        strY = Right(strY, 4)
        lngX = CLng(strX)
        lngY = CLng(strY)
        Form1.PSet (lngX, lngY), RGB(255, 255, 255)
    Next

End Sub

Private Sub Form_Load()
    Form1.BackColor = RGB(0, 0, 0)
'
End Sub



このページと関連する記事:
#692-3左側の0を取除くには?2002-05-31(金) 02:50
#3102-0ランダムについて。1999-10-20(水) 22:22
#1028-0前に出たデータを除外するには?1999-08-21(土) 15:07
#2599-0INIファイルからの数値の読み込み2001-12-08(土) 09:24
#2599-3INIファイルからの数値の読み込み2001-12-08(土) 00:24
#17914-0ランダム2001-09-20(木) 14:39
#296-3VBで構造体をバイナリー保存したいのですが2003-08-07(木) 09:37
#60-2Cmmand Buttonの形状2003-04-22(火) 21:44
#5187-0フォームに計算結果を簡単なグラフとして表示したい!!2000-01-21(金) 12:02
#403-4オセロゲーム2003-11-30(日) 16:01
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)