描述
city喜欢自己做游戏玩,游戏里需要一些随机数,由于系统自带的rand只能到32768,于是百度了一下,找到了下面这一个函数,选3个数A,B,C后运行K次后,生成一个随机序列,然后city在从这个序列里随机选取数字,用作游戏里的随机数。
unsigned x = A, y = B, z = C;
unsigned Random() {
unsigned t;
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}
在city做好游戏后,zzx感觉这个随机序列不是平均分布的,所以想要验证一下,但zzx事情比较多,想请你帮忙统计一下这个随机序列的最大值,最小值,平均数,来帮助zzx验证。
输入
输入数据有多组,输入到文件结束为止
第一行三个正整数A,B,C(A,B,C<10000)代表随机种子。
第二行一个K,表示生成了K(K<106)个随机数。
输出
第一行有两个整数,为最小值和最大值,用空格隔开
第二行有一个保留两位小数的平均数。
样例输入
1 1 1
10
样例输出
1 693053781
277275377.80
代码
#include <bits/stdc++.h> using namespace std; unsigned x , y , z ; unsigned Random() { unsigned t; x ^= x << 16; x ^= x >> 5; x ^= x << 1; t = x; x = y; y = z; z = t ^ x ^ y; return z; } int main() { unsigned A,B,C; while(cin>>A>>B>>C) { int k; cin>>k; x = A, y = B, z = C; unsigned minn=(1 << 32)-1,maxn=0; long long sum=0; for(int i=1;i<=k;i++) { unsigned u=Random(); minn=min(minn,u); maxn=max(maxn,u); sum+=u; } printf("%u %u\n",minn,maxn); printf("%.2f\n",sum*1.0/k); } }