随机生成数字的c语言程序设计,C中的随机数生成…第一个数字不是很随机

不,不要扔掉第一个.这会扭曲结果.序列{1,1,1}与任何其他任意七位数序列完全一样,尽管人类试图在所有事物中找到意义的倾向:-)

试图摆弄它因为你不喜欢这个序列会使随机数生成更糟,而不是更好.

对于它的价值,你应该确保你的运行至少间隔一秒,这样你就不会使用相同的种子(这似乎不是这里的情况).除此之外,使用PRNG按原样提供的结果或找到更好的发电机.

你是一个统计学家/密码​​学家,你不会使用正常的随机函数,或者它真的没关系!对于绝大多数情况,它是后者.

如果你不想要一个花哨的(或一个涉及大量额外的东西)并且你对实现提供的那个不满意,那么很容易实现一个基于gcc版本,如:

seed = (1103515245 * seed + 12345) & 0xffffffff

return seed & 0x7fffffff

并且请记住,初始种子值是根据提供给srand的参数计算的,其模数为231-1,以最小化与初始种子具有线性相关性的序列(序列仍然是线性的,而不是来自初始种子值).

如果您只是在寻找快速解决方案而不依赖于外部库或花费时间实现更复杂的生成器,以下代码可能会让您的生活更轻松:

// Assume 32-bit integer.

static int seed = 1;

void mySRand (int newseed) {

seed = newseed % 0x7fffffff;

}

int myRand() {

seed = 1103515245 * seed + 12345;

return seed & 0x7fffffff;

}

以下程序实际上会让您了解该算法将对提供给mySRand的种子值的小变化做些什么.

它从时间获得初始种子(NULL),然后显示20个连续种子值的初始值超出myRand,以及百分比变化.

#include

#include

#include

#include

static int seed = 1;

void mySRand (int newseed) { seed = newseed % 0x7fffffff; }

int myRand() { seed = 1103515245 * seed + 12345; return seed & 0x7fffffff; }

int main (void) {

int i,xyzzy,val,lastVal;

double avg,diff;

xyzzy = time (NULL);

mySRand (xyzzy);

lastVal = myRand();

printf ("seed=%d,val=%12d\n",lastVal);

for (i = 0; i < 20; i++) {

mySRand (++xyzzy);

val = myRand();

avg = val; avg = (avg + lastVal) / 2;

diff = 100 * fabs (avg - val) / avg;

printf ("seed=%d,val=%12d,avg=%12.1f,%%chg=%f\n",avg,diff);

lastVal = val;

}

return 0;

}

百分比变化基于当前值与当前值和之前的平均值之间的差异,以便有希望不引入偏差.示例输出是:

seed=1324533721,val= 1092183454

seed=1324533722,val= 48215051,avg= 570199252.5,%chg=91.544175

seed=1324533723,val= 1151730296,avg= 599972673.5,%chg=91.963792

seed=1324533724,val= 107761893,avg= 629746094.5,%chg=82.888041

seed=1324533725,val= 1211277138,avg= 659519515.5,%chg=83.660545

seed=1324533726,val= 167308735,avg= 689292936.5,%chg=75.727484

seed=1324533727,val= 1270823980,avg= 719066357.5,%chg=76.732504

seed=1324533728,val= 226855577,avg= 748839778.5,%chg=69.705726

seed=1324533729,val= 1330370822,avg= 778613199.5,%chg=70.864150

seed=1324533730,val= 286402419,avg= 808386620.5,%chg=64.571108

seed=1324533731,val= 1389917664,avg= 838160041.5,%chg=65.829626

seed=1324533732,val= 345949261,avg= 867933462.5,%chg=60.141039

seed=1324533733,val= 1449464506,avg= 897706883.5,%chg=61.463005

seed=1324533734,val= 405496103,avg= 927480304.5,%chg=56.279815

seed=1324533735,val= 1509011348,avg= 957253725.5,%chg=57.639642

seed=1324533736,val= 465042945,avg= 987027146.5,%chg=52.884483

seed=1324533737,val= 1568558190,avg=1016800567.5,%chg=54.264095

seed=1324533738,val= 524589787,avg=1046573988.5,%chg=49.875518

seed=1324533739,val= 1628105032,avg=1076347409.5,%chg=51.262038

seed=1324533740,val= 584136629,avg=1106120830.5,%chg=47.190523

seed=1324533741,val= 1687651874,avg=1135894251.5,%chg=48.574735

所以你可以看到,基于靠近的初始种子,起始值实际上存在很大差异.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值