目次 →実行時ライブラリー参考→
数学関連 →
RND ←オリジナル・サイト
範囲
[0, 1) で無作為の
DOUBLE (倍精度) 数を返します。
注:記号「[」は、「以上」を、「)」は、「未満」を意味します。
構文:
用法:
result = Rnd ( seed )
パラメタ:
seed
Optional
SINGLE (短精度) argument.
seed (種)にゼロ (
0.0 ) の値を設定すると、最後に発生した乱数が繰り返されます。ゼロ以外の場合は、新しい乱数が返されます。
QB互換アルゴリズムで、負数は、新しい種で生成させます。
未設定の場合は、新しい乱数を返します。
戻り値:
生成された乱数が、戻ります。
説明:
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)で、表示・編集して下さい。
'//------------------------------------//
'作成 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
方言差:
使用されるデフォルト・アルゴリズムは、使用中の現在の方言によります:
-lang fb 方言では、32ビットの精度(granularity 細かさの度合い)がある、32ビットのメルセンヌ・ツイスター関数が、使われています。
-lang qb 方言では、QB の Rnd と同じ出力を与える関数が、使われています。
精度(granularity 細かさの度合い)は、24ビットです。
-lang deprecated と、-lang fblite 方言では、システムで利用可能な C ランタイムの関数が、使われています。
Win32 で利用可能な関数は、15ビットの精度(granularity 細かさの度合い)、リナックスとDOSは、32ビットの精度を持っています。
バージョン:
fbc 1.10.0 より前 (for fbc 1.08.0 and fbc 1.09.0), 「fbprng.bi」は「fbmath.bi」という名前でした。
fbc 1.08.0 より前:
Rnd はスレッドセーフではありませんでした(同じスレッドに対して多くの値が一時的に重複して返されました)。
使用可能なアルゴリズムの標準「fbmath.bi」ヘッダーは存在しませんでした。
QBとの違い:
-lang qb 方言でコンパイルすると、違いは有りません。
また、他の方言では、適切なパラメタで、 Randomize することによって、種を蒔いて、アルゴリズムを発生させることで、同様に使用できます。
QB非互換アルゴリズムのために、オプション・引数 が、0未満であるなら、それは、1を設定したのと同じ意味になります。
参照: