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

FreeBASIC Randomize

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

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


乱数発生器に、種をまきます。

構文:
declare sub Randomize ( byval seed as double = -1.0, byval algorithm as long = 0 )

用法:
Randomize [ seed ] [, algorithm ]

パラメタ:
seed
乱数発生器の double の種の値ですが、アルゴリズム #4(以下を参照) を除くすべてのアルゴリズムで小数部分が切り捨てされます。
省略すると、Timer に基づく値が代わりに使われます。

algorithm
アルゴリズムを選択するための整数値 (使用可能なアルゴリズムについては、標準ヘッダー「fbprng.bi」を参照してください)。 省略すると、現在の FreeBASIC の言語方言 のデフォルトのアルゴリズムが使用されます。

記述:
Randomize は、Rnd が乱数を生成するために使う乱数の種を設定し、使用するアルゴリズムを選択します。
algorithm の定数は fbprng.bi で定義されています。-lang fb 方言では、これらの定数は FB Namespace の一部です。
algorithm の有効な値は次のとおりです:

FB_RND_AUTO (0) - 現在の FreeBASIC の方言 のデフォルトです。
-lang fb 方言のアルゴリズム FB_RND_MTWIST (3)
-lang qb 方言の FB_RND_QB (4)
-lang fblite 方言のFB_RND_CRT (1)

FB_RND_CRT (1) - C 実行時ライブラリの rand() 関数を使います。これは、プラットフォームによって異なる結果が得られます。
FB_RND_FAST (2) - 高速実装を使います。これはすべてのプラットフォームで安定しており、32ビットの粒度と適度なランダム性を提供します。
FB_RND_MTWIST (3) - メルセンヌ・ツイスターを使います。これは、すべてのプラットフォームで安定しており、32ビットの粒度を提供し、高度な偶発性を提供します。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3%83%BB%E3%83%84%E3%82%A4%E3%82%B9%E3%82%BF
FB_RND_QB (4) - QBASIC と同じ乱数シーケンスを与えるように設計された関数を使います。これはすべてのプラットフォームで安定しており、偶発性の程度は低く、24ビットの精度を提供します。
FB_RND_REAL (5) - Win32 と Linux で利用可能で、システム機能(Win32 Crypto API、Linux /dev/urandom)を使って暗号的にランダムな数値を提供します。これらのシステム API が使えない場合は、代わりに FB_RND_MTWIST (3) アルゴリズムが使われます。

各アルゴリズムは、与えられた任意の種を使って、その種の特定で決定論的な数列を生成します。
異なった数列を生成するために、呼び出すたびに Randomize したいなら、予測できない種を使う必要があります。たとえば、Timer から返される値などです。seed パラメータを省略すると、Timer に基づく値が使われます。

注意:アルゴリズム #4 を除くすべてのアルゴリズムでは、シードの小数部分が切り取られるため、パラメーターとして Timer 値を直接使うと、同じ秒間に複数回使うと同じシードが生成されます。
しかし、一般に、予測できない種子を使って二度 Randomize を呼ぶ価値は、ありません。2番目の連鎖は、最初ほど無作為にならず、数列の重複を誘発するからです。 ほとんどの場合、メルセンヌ・ツイスターは、Rnd 呼び出しの間に再シードを必要とせずに、十分に無作為な数列を提供します。

QB 互換アルゴリズムを使って Randomize を呼び出すと、古い種の一部が保持されます。 つまり、同じ種で何度も Randomize を呼び出しても、毎回同じシーケンスになるわけではありません。
QB 互換モードで特定の連鎖を取得したいときは、Rnd に負のパラメータを指定して種を設定します。

注意:
Randomize は (内部ミューテックスを使用することにより) スレッドセーフですが、スレッド固有ではありません。
他の乱数ジェネレーターの未完成の構造体も、標準ヘッダー "fbprng.bi" で利用できます。

例:
'' RNG の種を、C の rand() を使う方法にします
Randomize , 1

'' 乱数の系列を表示します
For i As Integer = 1 To 10
    Print Rnd
Next
Sleep


 フォーラムに掲示されていた使い方の注意です。
 PC の稼働時間に依存しない設定例:
'How to use RND and RANDOMIZE TIMER
'by deltarho[1859] ≫ May 02, 2023 22:59
'https://www.freebasic.net/forum/viewtopic.php?p=298368#p298368

Randomize , 5      ' 暗号化
Dim seed As Single ' 必要なシード データ型
seed = Rnd*10^7    ' 有効数字
Randomize seed, 3  ' 既定のアルゴリズム
注意:シードを再度ランダム化する場合のようにシーケンスを繰り返したい場合以外は、シーケンスの重複を避けるために、Randomize を複数回使用しないでください。

バージョン: 方言差:
使用されるデフォルト・アルゴリズムは、現在使われている方言によります:
  • -lang fb 方言では、32ビットの精度がある、32ビットのメルセンヌ・ツイスター関数が使用されています。
  • -lang qb 方言では、QB の Rnd と同じ出力を与える関数が使われます。 精度は、24ビットです。
  • -lang deprecated-lang fblite 方言で、システムで利用できる、C ランタイムの関数が使用されています。
    関数は、Win32 で 15ビット、Linux と DOS で 32ビットの精度があります。
QBからの違い:
参照:
数学関連 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2022-04-14 02:12:23
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

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

表示-非営利-継承