java.util.Random実装の方法と原則の紹介
Java ユーティリティ クラス ライブラリの java.util.Random クラスは、さまざまな種類の乱数を生成するメソッドを提供します。次の記事では、主に java.util.Random の実装原理に関する関連情報を紹介します。紹介はとても詳しく書かれているので、困っている友達は参考にしてください。
概要
java.util.Randomは、int、long、float、double、Goussianなどの型の乱数を生成できます。これは、double 型の乱数のみを生成する java.lang.Math のメソッド Random() との最大の違いでもあります。
このクラスのインスタンスは、擬似乱数のストリームを生成するために使用されます。このクラスは、線形合同式によって変更された 48 ビット シードを使用します。 Random の 2 つのインスタンスが同じシードで作成された場合、各インスタンスで同じ一連のメソッド呼び出しを完了することにより、同じ一連の数値が生成されて返されます。
例
public class RandomTest { public static void main(String[] args) { testRandom(); System.out.println("---------------------"); testRandom(); System.out.println("---------------------"); testRandom(); } public static void testRandom(){ Random random = new Random(1); for(int i=0; i<5; i++){ System.out.print(random.nextInt()+"\t"); } System.out.println(""); } }
出力結果:
この結果から、シードが同じである限り、得られる乱数の系列は一貫していることがわかります。これは疑似乱数の実装であり、真の乱数ではありません。
ランダムソースコード解析
ランダムクラス構造
class Random implements java.io.Serializable { private final AtomicLong seed; private static final long multiplier = 0x5DEECE66DL; private static final long addend = 0xBL; private static final long mask = (1L << 48) - 1; private static final AtomicLong seedUniquifier = new AtomicLong(8682522807148012L);
にはパラメータ構築メソッドがある
public Random(long seed) { if (getClass() == Random.class) this.seed = new AtomicLong(initialScramble(seed)); else { // subclass might have overriden setSeed this.seed = new AtomicLong(); setSeed(seed); } } private static long initialScramble(long seed) { return (seed ^ multiplier) & mask; }
上記の例より、乱数が生成されていることがわかります。シードが同じ方法で生成されること 乱数シーケンスが同じであること 使用するたびに異なるシーケンスを生成したい場合は、毎回異なるシードを渡すだけです。
パラメータなしの構築方法
public Random() { this(seedUniquifier() ^ System.nanoTime()); } private static long seedUniquifier() { // L'Ecuyer, "Tables of Linear Congruential Generators of // Different Sizes and Good Lattice Structure", 1999 for (;;) { long current = seedUniquifier.get(); long next = current * 181783497276652981L; if (seedUniquifier.compareAndSet(current, next)) return next; } }
ソースコードを通じて、パラメータなしの構築方法がシードを自動的に生成し、CASスピンメソッドを使用してシードが確実に取得されることがわかりました。は毎回異なるため、毎回取得されるランダム シーケンス new Random()
は確実に矛盾します。
nextInt() メソッド: int 乱数の取得
public int nextInt() { return next(32); } protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend) & mask; } while (!seed.compareAndSet(oldseed, nextseed)); return (int)(nextseed >>> (48 - bits)); }
コードから、シードが決定される限り、毎回生成される数値は固定アルゴリズムを使用して生成されることがわかります。シードが決定される限り、毎回生成されるシーケンスは固定されます。
シードが更新されるたびに、同時実行性の高い環境では CAS が使用され、パフォーマンスが問題になります。
セキュリティ問題
想像してみてください、これが宝くじプラットフォームである場合、シードが決定されている限り、生成されるシーケンスは毎回同じになります。このように、この抜け穴を利用して次回の宝くじの番号を予測することができ、一部の人々によって簡単に悪用される可能性があります。
jdk は、SecureRandom を使用して乱数を生成することをお勧めします。
SecureRandom
SecureRandom は、強力な乱数生成器です。 主なアプリケーション シナリオは次のとおりです。 秘密鍵やセッション ID の生成など、セキュリティ目的のデータ番号。弱い乱数ジェネレーターのセキュリティ問題は誰にでもさらされており、SecureRandom のような強力な乱数ジェネレーターを使用すると、問題のリスクが大幅に軽減されます。
強度の高い乱数を生成するには、シードとアルゴリズムという 2 つの重要な要素があります。多くのアルゴリズムが存在する可能性があり、通常、シードをどのように選択するかが非常に重要な要素になります。 たとえば、Random のシードは System.currentTimeMillis() であるため、その乱数は予測可能であり、弱い擬似乱数です。
強力な擬似乱数生成のアイデア: さまざまなコンピューター情報、キーボード入力時間、メモリ使用状況、ハードディスクの空き容量、IO 遅延、プロセス数、スレッド数およびその他の情報、CPU クロックを収集して、ほぼランダムなシードを取得します。 、主に予測不可能性を実現するためです。
簡単に言うと、暗号化アルゴリズムを使用して非常に長いランダム シードを生成します。これにより、シードを推測できなくなり、ランダム シーケンス番号を推測できなくなります。
ランダムのパフォーマンスの問題
ランダムのソースコードから、乱数を取得するたびに CAS を使用してシード値を更新していることがわかりました。このように、同時実行性の高い環境では CAS の再試行が多数発生し、パフォーマンスが低下します。現時点では、ThreadLocalRandom クラスを使用して乱数を生成することをお勧めします。
ThreadLocalRandom実装原理
Threadクラス
ThreadクラスにはthreadLocalRandomSeed属性があります。
スレッドローカルランダム構造
SEED 変数は、Thread オブジェクト内の threadLocalRandomSeed のオフセットです。
ThreadLocalRandom.nextSeed() メソッド
このメソッドから、各スレッドのシード値が Thread オブジェクトの threadLocalRandomSeed プロパティに格納されていることがわかります。
結論
ThreadLocalRandomのシードはThreadオブジェクトに格納されるため、同時実行性の高いRandomオブジェクトを取得する場合、毎回取得される値の不整合を保証するためにCASは使用されません。
各スレッドは独自のシードを保持し、乱数を取得する必要がある場合、現在の Thread オブジェクトから現在のスレッドのシードを取得し、パフォーマンスが大幅に向上します。
以上がjava.util.Random実装の方法と原則の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WeChat は主流のチャット ツールの 1 つであり、WeChat を通じて新しい友人に出会ったり、古い友人に連絡したり、友人間の友情を維持したりすることができます。永遠に終わらない宴会など存在しないように、人間同士が仲良くなれば必ず意見の相違が生じます。ある人があなたの気分に極度に影響を与える場合、または仲良くなったときに意見が一致しないことがわかり、コミュニケーションが取れなくなった場合、WeChat の友人を削除する必要がある場合があります。 WeChatの友達を削除するにはどうすればよいですか? WeChat友達を削除する最初のステップ:WeChatメインインターフェースで[アドレス帳]をタップします; 2番目のステップ:削除したい友達をクリックして[詳細]を入力します; 3番目のステップ:上部の[...]をクリックします右隅; ステップ 4: 下の [削除] をクリックします; ステップ 5: ページのプロンプトを理解した後、[連絡先を削除] をクリックします;

トマト ノベルは非常に人気のある小説閲覧ソフトウェアです。トマト ノベルでは、新しい小説や漫画を読むことができます。どの小説も漫画もとても面白いです。小説を書きたい友達もたくさんいます。お小遣いを稼いで、小説の内容を編集することもできます。 「テキストに文章を書きたいです。それで、小説はどうやって書くのですか?友達は知らないので、一緒にこのサイトに行きましょう。小説の書き方の入門を少し見てみましょう。」 Tomato Novels を使用して小説を書く方法に関するチュートリアルを共有します。 1. まず、携帯電話で Tomato Free Novels アプリを開き、パーソナル センター - ライター センターをクリックします。 2. Tomato Writer Assistant ページに移動し、次の場所で [新しい本の作成] をクリックします。小説の終わり

Colorful マザーボードは中国国内市場で高い人気と市場シェアを誇っていますが、Colorful マザーボードのユーザーの中には、設定のために BIOS を入力する方法がまだ分からない人もいます。この状況に対応して、編集者はカラフルなマザーボード BIOS に入る 2 つの方法を特別に提供しました。ぜひ試してみてください。方法 1: U ディスク起動ショートカット キーを使用して、U ディスク インストール システムに直接入ります。ワンクリックで U ディスクを起動する Colorful マザーボードのショートカット キーは ESC または F11 です。まず、Black Shark インストール マスターを使用して、Black Shark インストール マスターを作成します。 Shark U ディスク起動ディスクを選択し、コンピュータの電源を入れます。起動画面が表示されたら、キーボードの ESC キーまたは F11 キーを押し続けて、起動項目を順次選択するウィンドウに入ります。「USB」の場所にカーソルを移動します。 」と表示され、その後

残念ながら、WeChat は広く使用されているソーシャル ソフトウェアであり、何らかの理由で特定の連絡先を誤って削除してしまうことがよくあります。ユーザーがこの問題を解決できるように、この記事では、削除された連絡先を簡単な方法で取得する方法を紹介します。 1. WeChat の連絡先削除メカニズムを理解します。これにより、削除された連絡先を取得できるようになります。WeChat の連絡先削除メカニズムでは、連絡先がアドレス帳から削除されますが、完全には削除されません。 2. WeChat の組み込みの「連絡先帳復元」機能を使用します。WeChat には、この機能を通じて以前に削除した連絡先をすばやく復元できる「連絡先帳復元」機能が用意されています。 3. WeChat 設定ページに入り、右下隅をクリックし、WeChat アプリケーション「Me」を開き、右上隅にある設定アイコンをクリックして設定ページに入ります。

携帯電話が人々の日常生活において重要なツールになるにつれて、フォント サイズの設定は重要なパーソナライゼーション要件になりました。さまざまなユーザーのニーズを満たすために、この記事では、簡単な操作で携帯電話の使用体験を向上させ、携帯電話のフォントサイズを調整する方法を紹介します。携帯電話のフォント サイズを調整する必要があるのはなぜですか - フォント サイズを調整すると、テキストがより鮮明で読みやすくなります - さまざまな年齢のユーザーの読書ニーズに適しています - フォント サイズを使用すると、視力の悪いユーザーにとって便利です携帯電話システムの設定機能 - システム設定インターフェイスに入る方法 - 設定インターフェイスで「表示」オプションを見つけて入力します。 - 「フォント サイズ」オプションを見つけて、サードパーティでフォント サイズを調整します。アプリケーション - フォント サイズの調整をサポートするアプリケーションをダウンロードしてインストールします - アプリケーションを開いて、関連する設定インターフェイスに入ります - 個人に応じて

Win11 管理者権限の取得方法のまとめ. Windows 11 オペレーティング システムでは、管理者権限は、ユーザーがシステム上でさまざまな操作を実行できるようにする非常に重要な権限の 1 つです。ソフトウェアのインストールやシステム設定の変更など、一部の操作を完了するために管理者権限の取得が必要になる場合があります。以下にWin11の管理者権限を取得する方法をまとめましたので、お役に立てれば幸いです。 1. ショートカット キーを使用する Windows 11 システムでは、ショートカット キーを使用してコマンド プロンプトをすばやく開くことができます。

テクノロジーの発展に伴い、モバイルゲームは人々の生活に欠かせないものになりました。かわいいドラゴンエッグの画像と面白い孵化過程で多くのプレイヤーの注目を集めており、その中でも注目を集めているゲームの一つがモバイル版ドラゴンエッグです。プレイヤーがゲーム内で自分のドラゴンをより適切に育成し成長させることができるように、この記事ではモバイル版でドラゴンの卵を孵化させる方法を紹介します。 1. 適切な種類のドラゴン エッグを選択する プレイヤーは、ゲーム内で提供されるさまざまな種類のドラゴン エッグの属性と能力に基づいて、自分に適したドラゴン エッグの種類を慎重に選択する必要があります。 2. 孵化機のレベルをアップグレードします。プレイヤーはタスクを完了し、小道具を収集することで孵化機のレベルを向上させる必要があります。孵化機のレベルは孵化速度と孵化成功率を決定します。 3. プレイヤーはゲームに参加する必要がある孵化に必要なリソースを収集します。

Oracleバージョンのクエリ方法を詳しく解説 Oracleは、世界で最も人気のあるリレーショナルデータベース管理システムの1つで、豊富な機能と強力なパフォーマンスを提供し、企業で広く使用されています。データベースの管理と開発のプロセスでは、Oracle データベースのバージョンを理解することが非常に重要です。この記事では、Oracle データベースのバージョン情報をクエリする方法と具体的なコード例を詳しく紹介します。単純な SQL ステートメントを実行して、Oracle データベース内の SQL ステートメントのデータベース バージョンをクエリします。
