{
CoreApplication a(argc, argv, help);
QString cacheFile("random.cache");
int seed=0;
int generationCount=1;
double min=0.0, max=1.0;
enum Mode {Generate, TestPeriod, TestDistribution};
Mode mode=Generate;
double distributionMax=1.0;
qint64 distributionReset=268435456;
int i, j=1;
for(i=1; i<argc; i++) {
QByteArray arg=argv[i];
if(arg[0]=='-') {
if(arg=="-cache") {
CoreApplication::checkOptionArg(i, argc, argv);
cacheFile=argv[i];
} else if(arg=="-seed") {
CoreApplication::checkOptionArg(i, argc, argv);
seed=atoi(argv[i]);
} else if(arg=="-n") {
CoreApplication::checkOptionArg(i, argc, argv);
generationCount=atoi(argv[i] );
} else if(arg=="-min") {
CoreApplication::checkOptionArg(i, argc, argv);
min=atof(argv[i] );
} else if(arg=="-max") {
CoreApplication::checkOptionArg(i, argc, argv);
max=atof(argv[i] );
} else if(arg=="-test-period") {
mode=TestPeriod;
} else if(arg=="-test-distribution") {
mode=TestDistribution;
} else if(arg=="-distribution-max") {
CoreApplication::checkOptionArg(i, argc, argv);
distributionMax=atof(argv[i]);
} else if(arg=="-distribution-reset") {
CoreApplication::checkOptionArg(i, argc, argv);
distributionReset=atoi(argv[i]);
} else {
App::stream() << tr("gprandom: bad option %1, see -help").arg(argv[i]) << endl;
return 2;
}
} else {
argv[j++]=argv[i];
}
}
if(j < argc) {
argv[j]=0;
argc=j;
}
switch (mode) {
case TestPeriod: {
Random engine(seed);
engine.testPeriod();
return 0;
}
case TestDistribution: {
Random engine(seed);
engine.testDistribution(distributionMax, distributionReset);
return 0;
}
case Generate:
Random * engine=0;
QFile f(cacheFile);
if(f.open(QIODevice::ReadOnly)) {
QByteArray buf=f.readAll();
if(buf.size()==RANDOM_STATE_SIZE) {
engine=new Random(buf);
} else {
App::stream() << tr("gprandom: bad format for cache file %1, intializing a new random generator.").arg(cacheFile) << endl;
engine=new Random(seed);
}
f.close();
} else {
engine=new Random(seed);
}
QTextStream sOut(stdout);
for(int i=0; i<generationCount; i++) {
sOut << engine->uniform(min, max) << "\n";
}
sOut << flush;
if(f.open(QIODevice::WriteOnly)) {
f.write(engine->state());
f.close();
delete engine;
return 0;
} else {
App::stream() << tr("gprandom: cannot save cache file %1.").arg(cacheFile) << endl;
delete engine;
return 2;
}
break;
}
}