【题意】计算机模拟都需要随机数。一个产生伪随机数的方法是通过一个 seed(x+1) = [seed(x) + STEP] % MOD 这样形式的方法。如果不用STEP的话,将产生很有规律的随机数从0-mod-1,这样不好。如果加上STEP,例如 STEP = 3 and MOD = 5,则产生0, 3, 1, 4, 2,称为uniform distribution(均匀分布)。如果是STEP = 15 and MOD = 20,则产生 0, 15, 10, 5。任务就是判断给出的step和mod是否可以产生均匀分布的伪随机数。
注意:c++输出宽度的设置,通过setw()。
【代码:AC】
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAX 100000+10
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int num[MAX];
int STEP = 0, MOD = 0;
while (cin >> STEP >> MOD)
{
int i = 0, pos = 0;
memset(num, 0, sizeof(num));
for (i = 0; i < MOD; i++)
{
num[pos] = 1;
pos += STEP;
pos %= MOD;
}
int flag = 1;
for (i = 0; i < MOD; i++)
{
if (num[i] != 1)
flag = 0;
}
if (1 == flag)
cout << setw(10) << STEP << setw(10) << MOD << " Good Choice" << endl;
else
cout << setw(10) << STEP << setw(10) << MOD << " Bad Choice" << endl;
cout << endl;
}
return 0;
}