random1.cpp [C++]
// Random
//
// 2012.03.03 coded by 心如
#include <iostream>
#include <ctime>
using namespace std;
// 乱数
class Random{
int sd1, sd2, sd3;
void SetSeed(int);
public:
Random(){ SetSeed( time(NULL)); }
Random(int seed){ SetSeed( seed); }
float rand_f();
// 0以上n未満の整数の乱数
int rand_i(int n){ return (int )(rand_f() * n); }
};
// 乱数の初期値の設定
void Random::SetSeed(int seed){
sd1 = seed % 30269 + 1;
sd2 = seed % 30307 + 1;
sd3 = seed % 30323 + 1;
}
// 実数(0以上1.0未満)の一様乱数の発生
float Random::rand_f(){
float f;
sd1 = (sd1 % 177) * 171 - (sd1 / 177) * 2;
if(sd1 < 0) sd1 += 30269;
sd2 = (sd2 % 176) * 172 - (sd2 / 176) * 35;
if(sd2 < 0) sd2 += 30307;
sd3 = (sd3 % 178) * 170 - (sd3 / 178) * 63;
if(sd3 < 0) sd3 += 30323;
f = sd1 / 30269.0 + sd2 / 30307.0 + sd3 / 30323.0;
while( f >= 1.0){
f -= 1.0;
}
return f;
}
// 経過時間
class Timer{
clock_t stime;
public:
Timer(){ stime = clock(); }
float GetTime(){
return (float )(clock() - stime) / CLOCKS_PER_SEC;
}
};
const Mxn = 200;
const Kai = 1000000;
int main(){
int i, n, max, min;
int da[Mxn] = { 0};
Random a((int)time(NULL));
float fv;
Timer st;
for( i = 0; i < Mxn * Kai; i++){
n = a.rand_i( Mxn);
da[ n] += 1;
}
max = Kai;
min = Kai;
for(i = 0; i < Mxn; i++){
printf("%7d,", n = da[ i]);
if( max < n) max = n;
if( min > n) min = n;
}
cout << "Max=" << max << " Min="<< min << endl;
fv = st.GetTime();
cout << fv << "秒 "<< Mxn * Kai / fv << "回/秒";
}
─────
コメント 0