FreeBASIC マニュアルのトップに戻る

FreeBASIC Rnd

目次→実行時ライブラリー参考→数学関連RND←オリジナル・サイト

RND 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


 範囲 [0, 1) で無作為の DOUBLE (倍精度) 数を返します。
 注:記号「[」は、「以上」を、「)」は、「未満」を意味します。


構文:
declare function Rnd ( byval seed as SINGLE (短精度) = 1.0 ) as double

用法:
result = Rnd( seed )

パラメタ:
seed
Optional SINGLE (短精度) argument.
 seed(種)にゼロ (0.0) の値を設定すると、最後に発生した乱数が繰り返されます。ゼロ以外の場合は、新しい乱数が返されます。
 QB互換アルゴリズムで、負数は、新しい種で生成させます。
 未設定の場合は、新しい乱数を返します。

戻り値:
 生成された乱数が、戻ります。

説明:
 乱数の種子(Randomize を参考)にもとづく、[0, 1) の範囲(すなわち、0 ≦ Rnd < 1)の、double(倍精度) 形式の数が、戻ります。

 Rnd は、さまざまな異なったアルゴリズムを使用できます。
--デフォルトと選択可能なアルゴリズムの詳細については、関して Randomize を参考してください。

 プログラムが実行されるとき、Rnd は、いつも同じ数列を返します。
 ジェネレータの種子を変更することで、この系列を変えることができます。

注:
Rnd は (内部ミューテックスを使用して) スレッドセーフですが、スレッド固有ではありません。 マルチスレッド プログラムの文脈で使うと、実行速度のみがシングル スレッド呼び出し文脈と比較して大幅に遅くなります。
- fbc バージョン < 1.08 では、Rnd はスレッド・セーフではありません。 Rnd への非同期呼び出しによる競合状態のあるマルチスレッド・プログラムの文脈で使うと、同じスレッドに対して多くの値が一時的に重複して返されます。
- fbc バージョン >= 1.08 では、Rnd は(内部ミューテックスを使って)スレッドセーフになりましたが、スレッド固有ではありません。 マルチスレッドプログラムの文脈で使われる場合、単一スレッド呼び出しの文脈と比較して、実行速度が大幅に遅くなります。

他の乱数ジェネレーターの未完成の構造体も、標準ヘッダー "fbprng.bi" で利用できます。

例:
'' [最初, 最後)、または {最初 <= x < 最後} の範囲の乱数を発生させる関数
Function rnd_range (first As Double, last As Double) As Double
    Function = Rnd * (last - first) + first
End Function

'' 乱数発生器に種をまいて、毎回、同じ系列にならないようにします。
Randomize

'' 範囲 [0、1)、または {0 <= x < 1} の乱数を、表示します。
Print Rnd

'' 範囲 [0、10)、または {0 <= x < 10} の乱数を、表示します。
Print Rnd * 10

'' 範囲  [1, 10], か {1 <= n <= 10} の、無作為の整数を表示します。
''     (理由: 0 <= Rnd * 10 < 10)
Print Int(Rnd * 10) + 1

'' 範囲 [69, 420], か {69 <= n <= 420} の、無作為の整数を表示します。
''     (理由: 69 <= rnd_range(69, 421) < 421)
Print Int (rnd_range(69, 421))
Sleep



指定範囲の整数乱数を発生させる関数 (RandomValueCheck.bas)
' CheckAccuracyOfRandomNumbers


'' [最初, 最後]、つまり {最初 <= x <= 最後} の範囲の整数乱数を発生させる関数
Function RandomNumberInteger(Initial As Integer, Last As Integer) As Integer
   'Rnd 関数は、0 以上 1 未満の値を返します。
   RandomNumberInteger = Int(Rnd * (Last - Initial + 1)) + Initial
   'Int は、number の小数部分を取り除いて、その結果得られる整数値を返します。
   'このため Int を入れないと、最後より一つ大きい数が発生してしまいます。
End Function

Function RandomNumberIntegerNG(Initial As Integer, Last As Integer) As Integer
   'Rnd 関数は、0 以上 1 未満の値を返します。
   'Int を入れないと、最後より一つ大きい数が発生してしまいます。
   RandomNumberIntegerNG = Rnd * (Last - Initial + 1) + Initial
End Function



Dim Initial As Integer
Dim Last As Integer
Dim Accumulator(20, 2) As Integer
Dim Trials As Integer
Dim Number As Integer
Dim Counter As Integer
Dim Row As Integer
Dim Column As Integer


Initial = 1 ' 11
Last = 6 ' 20

For Trials = 1 To 100000
   Number = RandomNumberInteger(Initial, Last)
   Accumulator(Number - Initial + 1, 1) = Accumulator(Number - Initial + 1, 1) + 1
   Number = RandomNumberIntegerNG(Initial, Last)
   Accumulator(Number - Initial + 1, 2) = Accumulator(Number - Initial + 1, 2) + 1
Next Trials

For Row = 0 To 20
   Print Row,
   For Column = 1 To 2
      Print Accumulator(Row, Column) ,
   Next Column   
   Print 
Next Row

Sleep

'Emulate dice
'2020/04/29
'Rnd 関数を用いて偏りのないサイコロを実現する
'サイコロの目の数が 6 でない変則を考慮して結果を検証する

Function RndDice(me As Integer) As Integer
   '' 乱数発生器に種をまいて、毎回、同じ系列にならないようにします。
   Randomize
   RndDice = Int(Rnd * me) + 1
End Function

Dim MeKazu As Integer

Input "サイコロの目の数を入力して下さい: ", MeKazu

Dim Dice(MeKazu) As Integer
Dim Counter As Integer
Dim Roll As Integer

For Counter = 1 To MeKazu * 10000
   Roll = RndDice(MeKazu)
   Dice(Roll) = Dice(Roll) + 1
Next

For Counter = 1 To MeKazu
   Print Using "###  ##,###"; Counter; Dice(Counter)
Next
Print
Print "何かキー入力で終了"
Sleep


次の例は、さいころを 2つ使って、足し算の問題を自動生成することをイメージしたものです。
画像 BMP ファイルとプログラムをダウンロードできます。→ AdditionUsing2Dices.zip

注意:このソースは、Unicode(UTF16LE)で、表示・編集して下さい。
さいころ 2つで足し算の問題
'//------------------------------------//
'作成 2019/07/06
'プログラミングの考え方:さいころを 2つ使って足し算の問題を自動生成してみる
'注意: このソースは、ユニコードで、表示・編集して下さい。
'//------------------------------------//

#Include Once "xfont.bi"

Dim A As Integer
Dim B As Integer
Dim S As Integer
Dim Dice1 As Any Ptr
Dim Dice2 As Any Ptr
Dim FileName1 As String
Dim FileName2 As String
Dim KeyInput As Integer

Dim x As Integer
Dim y As Integer
Dim Japanese As WString * 20
Dim Shared As xfont.interface font
font.loadfont("MsGothic.xf", 1) 'FontIndex 1 に、登録します
font.fontindex = 1 'フォントを使います


Print "サイコロを使って、足し算の問題を自動生成します。"
Print "何かキー入力で回答を表示します。そして次の問題を生成してます。"
Print "問題生成のくり返えしは、[Esc]キーで抜けます。"
Print

Screen 18, 32

Dice1 = ImageCreate(170,170)  '画像のために、記憶装置を、割り当てて、初期化します。
Dice2 = ImageCreate(170,170)  '画像のために、記憶装置を、割り当てて、初期化します。

Randomize

Do
   Cls
   ScreenRes 640, 480, 32
   A = Rnd * 6 + 0.5
   B = Rnd * 6 + 0.5
   S = A+B
   
   FileName1 = "dice" & Str(A) & ".bmp"
   FileName2 = "dice" & Str(B) & ".bmp"
   BLoad FileName1, Dice1
   BLoad FileName2, Dice2
   
   Put (70,200),Dice1
   Put (360,200),Dice2
   
   Print
   Print
   Print
   Print
   Print Using "  ## + ## = "; A; B;
   Sleep
   
   Japanese =" " & Str(S) & "   [Esc]キーで抜ける"
   x = 150
   y = 100
   font.drawstring ( , Japanese , x, y,3,3) '文字の大きさ 3倍 size
   
   print
   KeyInput = GetKey
   Sleep(2000)

Loop Until KeyInput = 27 ' [27]=[Esc] キー入力するまで、繰返す

ImageDestroy(Dice1)     '画像のための記憶装置を破棄して、割り当てを解除します。
ImageDestroy(Dice2)

 フォーラムに掲示されていた使い方の例プログラム
'How To use Rnd And Randomize Timer
'Post by Triopstor ≫ May 01, 2023 6:42
'https://www.freebasic.net/forum/viewtopic.php?p=298358#p298358

Dim Shared As LongInt X1,X2,X3,X4
Dim Shared As Double N1

'プログラムの開始時に、RANDOMIZE TIMER を 1 回だけ、
'最初の FOR ループの前に使います。

Randomize Timer

For X4=1 To 20
   X2=0:X3=0
   
   For X1=1 To 1000000
       N1 = Int((Rnd(1) * 37))+1
       If N1<19 Then
          X2=X2+1
       Else
          X3=X3+1
       End If   
   Next X1
   
   Print "X2=";X2;" X3=";X3
Next X4

Sleep


方言差:

 使用されるデフォルト・アルゴリズムは、使用中の現在の方言によります:

バージョン: QBとの違い:
参照:
数学関連 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2022-04-14 02:13:36
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承