所以我到底和谁同桌(随机数用法)

#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