杭电OJ--1014
问题描述:
计算机模拟通常需要随机数。生成伪随机数的一种方法是通过窗体的函数
seed(x+1) = [种子 (x) + STEP]% MOD
其中 "%" 是模量运算符。
这样的函数将生成0和 MOD-1 之间的伪随机数 (种子)。此窗体的函数的一个问题是, 它们总是会反复生成相同的模式。为了最大限度地减少这种影响, 仔细选择 STEP 和 MOD 值可以在 (包括) 0 和 MOD-1 之间实现所有值的均匀分布。
例如, 如果 STEP = 3, MOD = 5, 则该函数将在重复循环中生成一系列伪随机数0、3、1、4、2。在本例中, 函数的每个 MOD 迭代都将生成0和 MOD-1 之间的所有数字, 包括0和 MOD-1。请注意, 根据每次发生种子 (x) 的函数生成相同 seed(x+1) 的性质, 这意味着如果一个函数将生成介于0和 MOD-1 之间的所有数字, 则它将在每个 MOD 迭代中均匀地生成伪随机数。
如果 STEP = 15, MOD = 20, 则该函数将生成系列0、15、10、5 (如果初始种子不是 0, 则生成任何其他重复系列)。这是一个很好的选择 STEP 和 MOD, 因为没有初始种子将生成所有的数字从0和 MOD-1。
您的程序将确定 STEP 和 MOD 的选择是否会生成伪随机数的均匀分布
seed(x+1) = [种子 (x) + STEP]% MOD
其中 "%" 是模量运算符。
这样的函数将生成0和 MOD-1 之间的伪随机数 (种子)。此窗体的函数的一个问题是, 它们总是会反复生成相同的模式。为了最大限度地减少这种影响, 仔细选择 STEP 和 MOD 值可以在 (包括) 0 和 MOD-1 之间实现所有值的均匀分布。
例如, 如果 STEP = 3, MOD = 5, 则该函数将在重复循环中生成一系列伪随机数0、3、1、4、2。在本例中, 函数的每个 MOD 迭代都将生成0和 MOD-1 之间的所有数字, 包括0和 MOD-1。请注意, 根据每次发生种子 (x) 的函数生成相同 seed(x+1) 的性质, 这意味着如果一个函数将生成介于0和 MOD-1 之间的所有数字, 则它将在每个 MOD 迭代中均匀地生成伪随机数。
如果 STEP = 15, MOD = 20, 则该函数将生成系列0、15、10、5 (如果初始种子不是 0, 则生成任何其他重复系列)。这是一个很好的选择 STEP 和 MOD, 因为没有初始种子将生成所有的数字从0和 MOD-1。
您的程序将确定 STEP 和 MOD 的选择是否会生成伪随机数的均匀分布
输入:
每行输入将包含一对整数的 STEP 和 MOD 按顺序 (1 < = STEP, MOD < = 100000)。
3 5 15 20 63923 99999
输出:
对于每行输入, 您的程序应打印步骤值右对齐列1到 10, MOD 值右对齐在列11到20和 "好的选择" 或 "坏选择" 左对齐在第25列。当选择 step 和 MOD 将生成 MOD 数字时, 生成包括0和 MOD-1 之间的所有数字时, 应打印 "良好选择" 消息。否则, 程序应打印消息 "错误的选择"。在每个输出测试集之后, 程序应只打印一个空行。
3 5 Good Choice 15 20 Bad Choice 63923 99999 Good Choice
#include <iostream>
#include<cstring>
#include<cstdlib>
#include<stdio.h>
using namespace std;
int main()
{
int step,mode;
while(cin>>step>>mode){
#include<cstring>
#include<cstdlib>
#include<stdio.h>
using namespace std;
int main()
{
int step,mode;
while(cin>>step>>mode){
int i,j,flag;
for(i=0;i<mode;i++)
{
char num[100001]={'0'};
int seed;
seed=(i+step%mode)%mode;
num[seed]='1';
for(j=1;j<mode;j++)
{
flag=0;
seed=(seed+step%mode)%mode;
if(num[seed]=='1')
{
flag=1;
break;
}
else num[seed]='1';
}
if(!flag)
break;
for(i=0;i<mode;i++)
{
char num[100001]={'0'};
int seed;
seed=(i+step%mode)%mode;
num[seed]='1';
for(j=1;j<mode;j++)
{
flag=0;
seed=(seed+step%mode)%mode;
if(num[seed]=='1')
{
flag=1;
break;
}
else num[seed]='1';
}
if(!flag)
break;
}
printf("%10d%10d ",step,mode);
if(!flag)
printf("%-s\n","Good Choice");
else printf("%-s\n","Bad Choice");
printf("\n");
}
return 0;
}
printf("%10d%10d ",step,mode);
if(!flag)
printf("%-s\n","Good Choice");
else printf("%-s\n","Bad Choice");
printf("\n");
}
return 0;
}