2013-04-06 66 views
-2

我试图生成兰特随机数如下:帮助我建立这个随机数

return a + (rand() % n); 

其中a是漂移值(即连续整数的所需范围的第一个数字)并且n是比例因子(即,连续整数的期望范围的宽度)。

- Ç如何第六版计划 - Deitel公司

我把它写成:

return 1 + (rand() % 1000); 

和它的作品,但是当我写的代码如下:

return 1000 + (rand() % 1112); 

我最终得到了荒谬的大数字,例如1756和1877.那是发生的最后两个输出。

我返回值作为一个整数的printf语句中的函数调用,但我做同样与工作发言,所以我不认为这我调用函数的方式。

我在做什么错了......?

+0

使用'兰特()%x'几乎总是略微向范围中的较低的数字偏压(因为如果'(RAND_MAX + 1)'是不x'的'的精确倍数,有更多的值,其中'兰特()%x == 0'比'rand()%x == x - 1')。为了保持一致性,你应该丢弃rand()大于或等于((RAND_MAX + 1)/ x)* x'的任何值,每次从rand()获得一个新值大。如果你不关心不一致性,这种改进是不必要的;只要知道你正在做的近似。 – 2013-04-06 01:04:14

+0

@JonathanLeffler更妙的是,根本就没有使用'rand'和用户一个适当的PRNG) – 2013-04-06 01:54:55

回答

5

你没有做错什么。你的期望是什么错误。

一个是,它可以产生最低的可能数目,但它可以产生最高的不是n ... n是范围的大小,因此它可以产生最高的数字是A + N。不仅要复制算法和代码,而且要理解它的工作原理非常重要。让我们来看看:

return 1000 + (rand() % 1112); 

rand()的范围是什么?任何介于0和RAND_MAX之间的数字(这是一个非常大的数字)

(rand()%1112)的范围是什么?首先,查找模运算。 1112?它可以是0(例如0/1112),也可以高达1111 1111/1112剩余的1111),但在此之后它将循环返回(1112/1112的余数为0,1113/1112的余数为1,等等)。

现在,什么是1000〜+(任何数量的从0到1111)?

+0

我得到这个与工作'1000 +(兰特()%112);'但我不明白我从来没有得到一个数字如果我使用'1 +(rand()%6),则为7;',谢谢你的帮助。 – chrstphrmllr 2013-04-06 01:22:18

+1

呃......'(rand()%6)'会给你一个介于0和5之间的数字。由于'1 + 0 = 1'和'1 + 5 = 6'当然你永远不会得到7 '1 +(rand()%6)' - 如果你这样做的话,会有*错误。你知道** modulo **操作的含义吗?如果没有,你可能想开始[这里](http://en.wikipedia.org/wiki/Modulo_operation)。 – 2013-04-06 01:52:50