C++各种产生伪随机数的问题

1. 基本问题,怎么产生一个[0..100]的随机数 #include #include #include int main(){ srand((unsigned)time(NULL)); for(int i=0; i<10; i++) printf("%d/t", rand()%100); return 0; } 虽然这是一个伪随机数序列,我做了实验,在10000个样本下,离10.00%的均匀分布有点距离,在100万个样本下已经非常好了。使用标准C++。 2. 怎么随机产生一个有6位数字的字符串(比如做密码、验证码用)? 这有两个方法: char password[7]; int i,j; srand(time(0)); for(i=0;i<6;i++) { j=rand()%10; password[i]=j+'0'; } password[6]='{row.content}'; 另一个方法: int password; int i,j; srand(time(0)); for(i=0;i<6;i++) { j=rand()%10; password= j + password*10; } //然后把int password转换城字符串就行了 cout< < #include #include #include int main() { std::vector ivec(0, 100); for ( int i=0; i<100; ++i ivec.push_back(i+1); std::copy( ivec.begin(), ivec.end(), std::ostream_iterator (std::cout, " " ; std::cout << "/n/n"; std::vector ::iterator it = ivec.begin(); std::vector ::iterator it_end = ivec.end(); std::random_shuffle( ivec.begin(), ivec.end() ; std::copy( it, it_end, std::ostream_iterator (std::cout, " " ; return 0; } 4. 再来一个,如何产生符合正态分布的随机数: /*一般有两种算法: 算法一产生12个(0,1)平均分布的随机函数,用大数定理可以模拟出正态分布。 算法二用到了数学中的雅可比变换,直接生成正态分布,但此算法在计算很大规模的数时 会出现溢出错误。 测试程序:*/ #include #include #include #include #include double _random(void) { int a; double r; a=rand()%32767; r=(a+0.00)/32767.00; return r; } double _sta(double mu,double sigma) { int i; double r,sum=0.0; if(sigma<=0.0) { printf("Sigma<=0.0 in _sta!"; exit(1); } for(i=1;i<=12;i++) sum = sum + _random(); r=(sum-6.00)*sigma+mu; return r; } double _sta2(double mu,double sigma) { double r1,r2; r1=_random(); r2=_random(); return sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu ; } int main() { int i; double mu,sigma; srand( (unsigned)time( NULL ; mu=0.0; sigma=1.0; printf("Algorithm 1:/n"; for(i=0;i<10;i++) printf("%lf/t",_sta(mu,sigma)); printf("Algorithm 2:/n"; for(i=0;i<10;i++) printf("%lf/t",_sta2(mu,sigma)); return 0; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值