2

我必须为 3 种不同的情况生成随机数。一世。1 个骰子 一对骰子 iii. 3 骰子我的问题: 1. 请建议我 sm good logic 为所有 3 个案例生成随机数。2. 当我考虑 2 个骰子而不是 1 个骰子的 cses 时,逻辑会改变吗?3.我们必须生成随机数的范围对随机函数的逻辑有多大影响?

4

3 回答 3

5

如果范围足够小,则使用通常的模数方法应该没有问题

int GetRandomInt(int Min, int Max)
{
    return (rand()%(Max-Min+1))+Min;
}

(其中MinaMax指定闭区间 [ Min, Max])

并为每次掷骰子调用一次。不要忘记在应用程序开始时调用(srand(time(NULL))在开始时,而不是每次您想要获得随机数时)来为随机数生成器播种。

如果范围开始变大,您可能不得不面对两个问题:

首先,范围rand()显然不是 [0, +∞),而是 [0, RAND_MAX],其中RAND_MAXa#define保证至少为 32767。如果您的范围 ( Max-Min) 跨越RAND_MAX,那么,使用此方法,您将有一些数字被返回的概率为零。

这更微妙:假设RAND_MAX大于您的范围,但不是那么大,假设RAND_MAX==1.5*/(Max-Min). 在这种情况下,结果的分布将不均匀:rand()返回范围 [0, RAND_MAX] 内的整数(并且此范围内的每个整数都应该是等概率的),但您将使用(Max-Min). 这意味着您所需范围的前半部分中的数字被返回的概率是其他数字的两倍:它们实际上可以来自范围的前三分之一三分之一rand(),而所需范围的后半部分只能来自从rand()范围的第二个三分之一。

这对你意味着什么?

大概什么都没有。如果你想要做的只是一个掷骰子模拟器,你可以使用模数方法没有问题,因为涉及的范围很小,第二个问题尽管仍然存在,但几乎无关紧要:假设你的范围是 3 和MAX_RAND32767:从 0 到 32765,0、1 和 2 具有相同的概率,但上升到 32767 0 和 1 获得一个潜在的退出,这几乎无关紧要,因为它们从完美的 1/3 (10922/32766=0,333 ...)对于 2(~0,33332)和 10923/32767(~0,33335)对于 0 和 1(假设rand()提供完美分布)的每个概率为 10922/32767。

无论如何,为了克服这些问题,一种非常常用的方法是使用以下方法将范围“拉伸”到rand()更宽的范围(或将其压缩到更小的范围):

int GetRandomInt(int Min, int Max)
{
    return (int)(((double)rand())/MAX_RAND*(Max-Min))+Min;
}

基于等价rand():MAX_RAND=X:(Max-Min)。必须转换为双精度,否则rand()与其最大值之间的整数除法将始终产生 0(或在 的极少数情况下为 1 rand()==MAX_RAND);如果 MAX_RAND 很小并且范围也不太宽,则可以先执行乘积的整数运算来完成,否则溢出的风险很高。

我怀疑,如果输出范围大于 的范围rand(),则“拉伸”和 fp 值截断(由于转换为 int)会以某种方式影响分布,但只是局部的(例如,在小范围内,您可能永远不会获得一定的数字,但在全球范围内分布看起来还不错)。

请注意,此方法有助于克服 C 标准库随机数生成器的普遍限制,即返回值的低位的低随机性 - 顺便说一下,当您执行模运算时使用的那些输出范围小。

However, keep in mind that the C standard library RNG is a simple one, that strives to comply with "easy" statistical rules, and as such is easily predictable; it shouldn't be used when "serious" random numbers are required (e.g. cryptography). For such needs there are dedicated RNG libraries (e.g. the RNG part of the GNU Scientific Library), or, if you need really random stuff, there are several real random number services (one of the most famous is this), which do not use mathematical pseudo-RNG, but take their numbers from real random sources (e.g. radioactive decay).

于 2010-09-24T11:59:17.337 回答
2

是的,就像 DarkDust 说的,这听起来像是家庭作业,所以,为了回答你的问题,我会说:

--> No, the logic doesnt not change, no matter how many dices you include.

--> Easiest way to do this would be, just make a function that give you ONE
    random function, and depending on how many dices you have, call it that
    many times. 

--> You can instead include for loop in the function and add the values into 
    array and return the array.

这样,您也可以为 100 个骰子生成随机数。

于 2010-09-24T11:21:52.533 回答
1

由于这听起来像是家庭作业,我只想给出对您来说应该“足够好”的提示(专业人士的做法会略有不同):使用random()函数和%(模)运算符。模数是除法后的“提醒”。

于 2010-09-24T11:07:27.930 回答