Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个c函数,根据特定范围生成一个随机数、一对随机数或三组随机数_C_Function_Random_Conceptual - Fatal编程技术网

编写一个c函数,根据特定范围生成一个随机数、一对随机数或三组随机数

编写一个c函数,根据特定范围生成一个随机数、一对随机数或三组随机数,c,function,random,conceptual,C,Function,Random,Conceptual,我必须为3种不同的情况生成随机数。 我1个骰子 二,。一对骰子 三、3个骰子 我的问题是: 1.请建议我sm良好的逻辑,为所有3种情况生成随机数。 2.当我考虑2个骰子的CSE而不是1个时,逻辑会改变吗? 3.生成随机数的范围对随机函数的逻辑有多大的影响?既然这听起来像是家庭作业,我就给你一些提示,这些提示应该“足够好”(专业人士会做得稍有不同):使用random()函数和%(模)操作人员模是除法之后的“提醒物”。是的,就像DarkDust说的,这听起来像是家庭作业,所以,为了回答你的问题,记住

我必须为3种不同的情况生成随机数。 我1个骰子 二,。一对骰子 三、3个骰子 我的问题是: 1.请建议我sm良好的逻辑,为所有3种情况生成随机数。 2.当我考虑2个骰子的CSE而不是1个时,逻辑会改变吗?
3.生成随机数的范围对随机函数的逻辑有多大的影响?

既然这听起来像是家庭作业,我就给你一些提示,这些提示应该“足够好”(专业人士会做得稍有不同):使用
random()
函数和
%
(模)操作人员模是除法之后的“提醒物”。

是的,就像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个骰子生成随机数。

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

int GetRandomInt(int Min, int Max)
{
    return (rand()%(Max-Min+1))+Min;
}
(其中
Min
a
Max
指定一个闭合间隔,[
Min
Max

每掷一次骰子就叫一次。不要忘记在应用程序开始时调用
srand(time(NULL))
(仅在开始时,而不是每次要获取随机数时)为随机数生成器设定种子

如果范围开始变大,您可能会面临两个问题:

首先,
rand()
的范围显然不是[0+∞), 相反,它是[0,
RAND_MAX
”,其中
RAND_MAX
是一个
\define
保证至少为32767。如果您的范围(
MAX-Min
)跨越
RAND_MAX
,那么,使用此方法,您将拥有一些返回概率为零的数字

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

这对你意味着什么

可能什么都没有。如果你只想做一个掷骰子模拟器,你就可以不出问题地使用模方法,因为所涉及的范围很小,第二个问题,尽管仍然存在,但几乎无关紧要:假设你的范围是3,并且
MAX_RAND
32767:从0到32765,0、1和2的概率相同,但是g如果达到32767 0和1,则获得一个潜在的退出,这几乎是不相关的,因为它们从每一个的完美1/3(10922/32766=0333…)概率传递到2(~033332)的10922/32767,以及0和1的10923/32767(~033335)(假设
rand()
提供了完美分布)

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

int GetRandomInt(int Min, int Max)
{
    return (int)(((double)rand())/MAX_RAND*(Max-Min))+Min;
}
基于等价性
rand():MAX_rand=X:(MAX-Min)
。必须转换为double,否则
rand()
与其最大值之间的整数除法将始终产生0(或在
rand()==MAX_rand
的罕见情况下产生1);如果MAX_RAND很小,且范围也不太宽,则可以通过整数运算首先执行乘积,否则溢出风险很高

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

请注意,此方法有助于克服C标准库随机数生成器的扩散限制,即返回值较低位的随机性较低,顺便说一句,这是在输出范围较小的情况下执行模运算时使用的位


但是,请记住,C标准库RNG是一个简单的库,它致力于遵守“简单”的统计规则,因此很容易预测;当需要“严重”随机数时(例如,密码学),不应使用它。对于这种需要,有专门的RNG库(例如,GNU科学库的,或者,如果你需要真正的随机数据,有几种实随机数服务(其中最著名的是),它们不使用数学伪RNG,而是从实随机源(例如放射性衰变)获取它们的数字。

@Matteo Italia:在POSIX系统上,有两种:
int rand(void);
long rand(void)
,都是在stdlib.h中定义的。不过,我不知道Windows。正如TS所说的骰子,我想指出的是,由于最大值不是6的倍数,仅使用“模”将产生一个“加载的骰子”。您可以通过使用“模8”而不是“模6”并丢弃数>=6来克服这一问题。更多详细信息可在Knuth的“编程的艺术”,关于随机数的一章(我不记得确切的参考文献)我检查了它,它确实是在stdlib.h中定义的,但是他们手册页的符合部分指定
rand()
符合
SVr4,4.3BSD,C89,C99,POSIX.1-2001
,而
random()
4.3BSD,采购订单