疑似乱数生成用の線形合同法を実装するC++プログラム
線形合同法は、乱数発生器の非常に単純な例です。これは、最も古く、最もよく知られている疑似乱数生成アルゴリズムの1つです。このメソッドで使用される関数-
Xn+1=(aXn + C) mod m
ここで、Xは疑似乱数値のシーケンスであり、
m,0<m— the “modulus" a,0<a<m — the "multiplier" c,0<c<m — the "increment" X0, 0<x0<m — the "seed" or "start value"
ジェネレータを指定する整数定数です。
この方法の利点は、パラメータを適切に選択することで、期間が既知で長くなることです。
アルゴリズム
Begin Declare class mRND Create a function Seed(number) Assign a variable _seed=number Create a constructor mRND Declare _seed(0), a(0), c(0), m(2147483648) Create a function rnd() Return _seed = (a * _seed + c) mod m Declare a, c, m, _seed Done Declare an another subclass MS_RND inheriting from base class mRND Create a constructor Read the variables a, c Create a function rnd() return mRND::rnd() right shift 16 Done Declare an another subclass BSD_RND inheriting from base class mRND Create a constructor Read the variables a, c Create a function rnd() return mRND::rnd() Done For x=0 to 6 Print MS_RAND For x=0 to 6 Print BSD_RAND Done End
サンプルコード
#include <iostream> using namespace std; class mRND { public: void seed(unsigned int s) { _seed= s; } protected: mRND() : _seed(0), a(0), c(0), m(2147483648) { } int rnd() { return (_seed = (a * _seed + c) % m); } int a, c; unsigned int m, _seed; }; class MS_RND: public mRND { public: MS_RND() { a = 214013; c = 2531011; } int rnd() { return mRND::rnd() >> 16; } }; class BSD_RND: public mRND { public: BSD_RND() { a = 1016404597; c = 12345; } int rnd() { return mRND::rnd(); } }; int main(int argc, char* argv[]) { BSD_RND bsd_rnd; MS_RND ms_rnd; cout << "MS RAND:" << endl << "-----------" << endl; for (int x = 0; x < 6; x++) cout << ms_rnd.rnd() << endl; cout << endl << "BSD RAND:" << endl << "-------------" << endl; for (int x = 0; x < 6; x++) cout << bsd_rnd.rnd() << endl; return 0; }
出力
MS RAND: ------- 38 7719 21238 2437 8855 11797 BSD RAND: -------- 12345 1915290694 1005338679 629284700 741596485 1834373826
-
DAGのランダム線形拡大を作成するC++プログラム
ここでは、有向非巡回グラフ(DAG)のランダム線形拡大を作成する方法を説明します。線形拡大は、基本的にDAGのトポロジカルソートです。グラフを以下のように考えてみましょう- 有向非巡回グラフのトポロジカルソートは、頂点の線形順序付けです。有向グラフのすべてのエッジu-vについて、頂点uは順序付けで頂点vの前に来ます。 ソース頂点はデスティネーション頂点の後に来ることがわかっているので、スタックを使用して前の要素を格納する必要があります。すべてのノードが完成したら、スタックからそれらを表示するだけです。 入力 0 0 0 0 0 0 0 0
-
ヴィジュネル暗号を実装するためのC++プログラム
Vigenere Cipherは、アルファベットのテキストを暗号化する一種の多表式置換方法です。 この方法での暗号化と復号化には、AからZまでのアルファベットが26行で書き込まれるVigenereCipherTableが使用されます。 暗号化 キー: ようこそ メッセージ: Thisistutorialspoint ここでは、指定されたキーの長さが元のメッセージの長さと等しくなるまで、そのキーを繰り返してキーを取得する必要があります。 暗号化の場合は、メッセージの最初の文字とキー(TとW)を取得します。V行とW列が一致するVigenere Cipher Tableのアルファベ