#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main(){
srand(time(0));
while(true){
short x=rand();
if(x%3==0)cout<<"黄**"<<endl;
else if(x%3==1)cout<<"何**"<<endl;
else cout<<"张**"<<endl;
}
return 0;
}
2 个赞
不太规范, rand
产生的数是在 [0,RAND_MAX]
之间, %3==0
、 %3==1
、 %3==2
这些数产生的概率是不等的,可以使用这个函数获取 [a,b]
之间的数,概率也是相同的( |a-b| \le RAND\_MAX )
long long random(long long a,long long b){
return double(rand())/(RAND_MAX+1)*(max(a,b)-min(a,b)+1)+min(a,b);
}
3 个赞
模数才 3 。概率几乎可以看做是相等的了。
1 个赞
概率分别为 \dfrac{21845}{65536} 、 \dfrac{21846}{65536} 和 \dfrac{21845}{65536} 。
1 个赞
还有一个问题:
用short
会爆,要用unsigned short
。
RAND_MAX
的值在不同的电脑上是不同的,概率还是会有偏差
1 个赞
是,但即使是 1 字节也仅有 \dfrac{1}{256} 的偏差,几乎可以忽略不计。
1 个赞
就算是你的代码也是伪随机,几万分之一的概率在它面前几乎可以忽略不计。
rand()%n
本身不是一个很规范的写法,它所代表的只是一个值%n,不能作为随机数;
random
的确概率也会不相同,至少比 rand()%n
要更好
但真正想要一个高质量的随机数,就要使用C11的 随机数生成器和分布,就不用担心此类问题
头文件
#include<chrono>
#include<random>
函数
//mt19937 gen是全局,并且在long long random的前面
mt19937 gen(chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count());
//觉得milliseconds(毫秒)不够的可以用nanoseconds(纳秒)
long long random(long long a,long long b){
uniform_int_distribution<long long>dist(min(a,b),max(a,b));
return dist(gen);
}
1 个赞
six