C++でランダムな数字生成器を作る方法は、以下の通りです。
この記事では、C++で乱数生成器を作成するために必要な機能について説明します。コンピュータの世界では、ランダムな数字は匿名性とセキュリティを付加するために欠かせない要素です。
ランダムな数値生成器は、擬似乱数を生成するための基盤となります。
疑似乱数のアイデアは、コンピューターにはランダムな数字を選択する思考プロセスがないということです。したがって、出力された数字はランダムに見えるかもしれませんが、数学的に計算された値です。
srand()とrand()関数
C++のsrand()関数は擬似乱数の計算を行うことができます。この関数は乱数の計算の基礎となるシード値が必要です。
srand(unsigned int seed_value)
seed値の助けを借りて、srand()はrand()関数による疑似乱数の生成のための舞台を設定します。
int random = rand();
そして、見てください! 私たちはランダムな数を生成するという簡単な課題を達成しました。しかし、ランダムな数値生成器の背後にある概念を理解することが難しい部分です。
種の価値の重要性
シード値は、ランダムな数列の鍵となります。同じシード値が関数に提供された場合、計算される数列は類似するものとなります。
srand()関数のデフォルトシード値は1です。したがって、新しいシード値を指定せずにrand()関数を呼び出すと、依然としてランダムな数字の列が返されます。問題は、プログラムを同じシード値で実行するたびに、出力が同じになることです。
問題への簡単な解決策は、プログラムを実行するたびに新しいシード値を使用することです。何が毎秒変化するかというと、時間です。私たちは現在のタイムスタンプをシード値として利用しました。
「タイムスタンプは、次の方法で作成することができます:」
time_t current_time = time(NULL);
現在の時間変数は、1970年1月以降に経過した秒数を保持しています。この値は、srand()関数に渡され、その後、新しい擬似乱数のシーケンスが得られます。
変数へのタイムスタンプの初期化をスキップして、単に関数にタイムスタンプを渡すことができます。
srand((unsigned) time(NULL));
プログラム内で生成する乱数の数に関係なく、シード値は一度だけ提供されます。
C++で完璧なランダム数生成器を作成する。
以下のコードは正しい方法で乱数を生成することを示しています。
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
// Providing a seed value
srand((unsigned) time(NULL));
// Get a random number
int random = rand();
// Print the random number
cout<<random<<endl;
return 1;
}
出力:
1897776064
通常の計算では適切に使用するには生成される数があまりにも大きすぎます。
特定の範囲内でランダムな数を生成してください。
特定の目的のために、ランダムな数値をある範囲内に制限する必要があります。そのために、モジュラス(余り)%演算子を使用します。
例えば、0から9までのランダムな数字を生成するためには、次のようにすることができます。
int random = rand() % 10;
同様に、1から9までのランダムな数字を取得する必要がある場合、私たちは次を使用します:
int random = 1 + (rand() % 9);
一般的な方程式は次のように述べることができます。
int random = offset + (rand() % range);
上記の式において:
- offset – The starting point for the range of random numbers
- range – The number of values between first and the last possible random number including the limits.
例えば、10から100までのランダムな数の中で、オフセットを10とし、レンジを91とします。
「100から200の範囲内で、ランダムな5つの数字を表示するプログラムの例を実行しましょう。」
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
// Providing a seed value
srand((unsigned) time(NULL));
// Loop to get 5 random numbers
for(int i=1; i<=5; i++){
// Retrieve a random number between 100 and 200
// Offset = 100
// Range = 101
int random = 100 + (rand() % 101);
// Print the random number
cout<<random<<endl;
}
return 1;
}
出力(Output):
144
175
162
137
200
最初に、もしシード値が提供されない場合、上記のプログラムの出力は実行するたびに常に同じになります。セット内のランダムな数値は異なるかもしれませんが、完全なセットは同一になります。
乱数生成器(RNG)の応用例
ランダム数生成の力は制限されているように見えるかもしれませんが、実際はそうではありません。そのため、RNGのいくつかの用途について見てみましょう。
暗号化 (Angōka)
暗号学の分野においては、予測不可能性はセキュリティの尺度とされています。そのため、キーやノンスなどの乱数生成器の利用が重要とされています。
ゲーム
伝統的なゲームには、サイコロやカードのシャッフルを通じてゲームにランダム性を導入し、楽しさや不確定な結果を追加してきました。同様に、現代のゲーム開発には、前後のランダム性の概念がゲームにさらなる次元を加えています。
ランダム化アルゴリズム
これらのアルゴリズムでは、既知のアルゴリズムに確率の要素が導入されています。何よりも重要なことは、これらのアルゴリズムの目的は、成功確率をトレードオフすることでより良いパフォーマンスを実現することです。
結論
RNGまたはPRNG(擬似乱数生成器)は、現代のサイバーセキュリティや暗号学の基礎です。これらのRNGの基本原理は、異なるように見える数値を提供する計算にあります。
読者にとって、この記事が分かりやすかったと願っています。ご質問や提案がありましたら、お気軽に以下へコメントしてください。