これは宿題に関する質問ですが、はるかに大きなプロジェクトの一部です。制約の1つは、何らかの理由でSTLを使用できないということです。cstdlibを使用せずに乱数を生成する?
私は自分のrand()関数をctimeと増分修飾子を使ってロールアップしようとしました。これは一貫したシードを持たなくても、同じ修飾子に1秒に1回以上給餌されない限り、関数は半乱数を出力すべきであると考えました。
//notcstdlib.cpp
//<ctime> <cmath>
int rand(int mod)
{
time_t seed;
return std::abs(seed * mod);
}
このサンプルコード
//main.cpp
#include "notcstdlib.h"
#include <iostream>
int main(int argc, char** argv)
{
int f;
for(int i = 1; i <= 10; i++)
{
f = rand(i);
std::cout << "random num= " << f << "\n";
std::cout << "rand % 10 = " << f%10 << "\n";
}
return 0;
}
常にすべての他の数の0と8との間の第一の値とのみ偶数として7を返します。
//Output 1 //Output 2 //Output 3
random num= 134514987 | random num= 134514987 | random num= 134514987
rand % 10 = 7 | rand % 10 = 7 | rand % 10 = 7
random num= 13261304 | random num= 24238584 | random num= 27941368
rand % 10 = 4 | rand % 10 = 4 | rand % 10 = 8
random num= 19891956 | random num= 36357876 | random num= 41912052
rand % 10 = 6 | rand % 10 = 6 | rand % 10 = 2
random num= 26522608 | random num= 48477168 | random num= 55882736
rand % 10 = 8 | rand % 10 = 8 | rand % 10 = 6
random num= 33153260 | random num= 60596460 | random num= 69853420
rand % 10 = 0 | rand % 10 = 0 | rand % 10 = 0
random num= 39783912 | random num= 72715752 | random num= 83824104
rand % 10 = 2 | rand % 10 = 2 | rand % 10 = 4
random num= 46414564 | random num= 84835044 | random num= 97794788
rand % 10 = 4 | rand % 10 = 4 | rand % 10 = 8
random num= 53045216 | random num= 96954336 | random num= 111765472
rand % 10 = 6 | rand % 10 = 6 | rand % 10 = 2
random num= 59675868 | random num= 109073628 | random num= 125736156
rand % 10 = 8 | rand % 10 = 8 | rand % 10 = 6
random num= 66306520 | random num= 121192920 | random num= 139706840
rand % 10 = 0 | rand % 10 = 0 | rand % 10 = 0
明らかに、私はrand()のいくつかの重要な面を見逃しており、実装していません。この問題に取り組むより良い方法はありますか?
擬似乱数ジェネレータの作成に関する課題はありますか? –
こちらをご覧ください:https://en.wikipedia.org/wiki/Linear-feedback_shift_register – DimChtz
https://stackoverflow.com/questions/3062746/special-simple-random-number-generator –