Delphi 2006でランダムな64ビット整数値を作成するにはどうすればよいですか?組み込みの整数ベースのRandom()関数は、0から2^31までの値のみを返すようです。
6 に答える
私のGpRandomGenを使用できます。Marsaglia / Zaman / Jamesアルゴリズムを実装し、非常に高速で、おそらく非常にランダムです。フリーウェアとしてリリースされました。
2 つの 32 ビット ランダムを生成し、それらをつなぎ合わせます。
編集
@Andreasの回答と同様に、次の(同等の)実装が好きです:
function Random64: UInt64;
var
Overlay: packed record
a, b: UInt32;
end absolute Result;
begin
Assert(SizeOf(Overlay)=SizeOf(Result));
Overlay.a := Random32;
Overlay.b := Random32;
end;
GUID(CoCreateGuidなど)を作成し、Int64にキャストします。
64個のランダムビットを生成し、その結果を整数として解釈できます。(符号付き整数を使用していて、結果を非負にしたい場合は63ビット。)同様に、0..2 ^ 31-1の範囲の2つのランダムな整数と2つの追加のランダムなビットを取得し、それらを連結してランダムな64ビット整数を取得します。
編集:疑似乱数コンポーネントを連結することによって生成された疑似乱数の統計的特性に興味があり、(明らかに)このアプローチは疑似乱数ジェネレーターによってはうまく機能しない可能性があることがわかりました(もちろん、真の乱数生成の場合、大気ノイズから、ランダムビットの連結は問題ありません)。娯楽目的での使用では、さまざまな統計的特性の喪失は許容できるかもしれませんが、より深刻な使用では、@gabrが提案したようにカスタム疑似ランダムジェネレーターが必要になる可能性があります。関連する質問があります:256のランダムビットで数値を生成する最良の方法は?
私自身の質問に答えるために、私は次のコードを思いついた:
function GetRandomInt64() : int64;
begin
Int64Rec(result).Words[0] := Random(High(Word));
Int64Rec(result).Words[1] := Random(High(Word));
Int64Rec(result).Words[2] := Random(High(Word));
Int64Rec(result).Words[3] := Random(High(Word));
end;
これが有効な解決策であるかどうか、または特定の結果番号Xの後に常に同じフォローアップ番号X+1が作成されるかどうかはわかりません。
単純:
function Random64: UInt64;
begin
PCardinal(@result)^ := Random32;
PCardinal(cardinal(@result) + 4)^ := Random32;
end;
Random32
お気に入りの 32 ビット符号なし整数乱数関数はどこにありますか。