读书人

C中如何产生更加合理的随机数

发布时间: 2013-04-02 12:35:26 作者: rapoo

C中怎么产生更加合理的随机数
C中可以使用rand()和srand(),但是当需要的随机数很小在10的-7方到10的-9时,产生的随机数一点都不合理,能有什么方法是随机数更合理吗?

double r = rand()%100 * 10e-9;
[解决办法]

    srand((UINT)time(NULL));

double f;
for(int i = 0; i != 500; ++i)
{
// 随机产生一个0-1之间的小数
int n = rand()%1000;
if (n == 999) // 细节处理,否则永远不会随机到1
{
f = 1;
}
else
f = (rand()%1000+1)/(1000.0);
f *= 1.5 * 1E-8; // 结果乘以最大值即可
cout << f << endl;
}

[解决办法]
我觉得lz是不是可以举个例子说明一下 rand出来的随机数是怎么不合理的?

如果你要一个精确到小数点后第n位的随机数,那么你可以对小数点后每一位进行随机



如果你要一个的是范围在10的-7方到10的-9之间的随机数,你可以随一个0-100的随机数,然后除以10的-9

如果你说的是浮点数的误差的问题,那这个没有办法,你直接赋值一个浮点数都是有误差的
double a = 1.23f * 1e-10;
我这边显示的是1.2300000190734864e-010


[解决办法]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
return (
(((unsigned long)rand()<<24)&0xFF000000ul)

[解决办法]
(((unsigned long)rand()<<12)&0x00FFF000ul)

[解决办法]
(((unsigned long)rand() )&0x00000FFFul));
}
int i;
unsigned long ul;
void main() {
srand(time(NULL));
for (i=0;i<10;i++) {
ul=ulrand();
printf("%010lu 0x%08x\n",ul,ul);
}
}
//2337588057 0x8b54c359
//1977377429 0x75dc6295
//3607316769 0xd7034921
//0009828482 0x0095f882
//3350859779 0xc7ba1003
//0945794621 0x385fae3d
//3400869024 0xcab524a0
//3097846779 0xb8a563fb
//4287421124 0xff8cdac4
//3934016258 0xea7c5302

[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。

读书人网 >C语言

热点推荐