C 使用随机数rand()计算数字
我正在学习C,发现C 使用随机数rand()计算数字,c,random,C,Random,我正在学习C,发现rand()非常奇怪,可能是因为它的随机性:p 我有下面的代码,它总是输出1,有什么问题吗?您将如何修改代码以使其完成任务 干杯 #include <stdlib.h> double rand_double() { double ret = (double)rand(); return ret/(RAND_MAX+1); } int sample_geometric_rv(double p) { double q; int n =
rand()
非常奇怪,可能是因为它的随机性:p
我有下面的代码,它总是输出1,有什么问题吗?您将如何修改代码以使其完成任务
干杯
#include <stdlib.h>
double rand_double()
{
double ret = (double)rand();
return ret/(RAND_MAX+1);
}
int sample_geometric_rv(double p)
{
double q;
int n = 0;
do
{
q = rand_double();
n++;
} while (q >= p);
return n;
}
int main()
{
int ans = sample_geometric_rv(0.1);
printf("Output %d\n", ans);
return 0;
}
#包括
double rand_double()
{
double ret=(double)rand();
回报率/(兰特最大值+1);
}
int样本_几何_rv(双p)
{
双q;
int n=0;
做
{
q=rand_double();
n++;
}而(q>=p);
返回n;
}
int main()
{
int ans=样品几何尺寸(0.1);
printf(“输出%d\n”,ans);
返回0;
}
您需要对随机数生成器进行一次种子设定。每次需要不同的序列时,使用具有不同值的srand()
在没有播种的情况下,就好像您发布了一个srand(1)代码>
通常,RNG以当前时间作为初始化值播种在main()
中。time()
返回的当前时间几乎保证在程序的每次运行中都是不同的(每秒更改一次)
#包括
#包括
内部主(空){
srand(时间(0));
/*程序的其余部分;不再调用srand()*/
返回0;
}
请注意,如果使用相同的编号初始化RNG,则会得到相同的序列。这可能很有趣,例如,重复数据
还请注意,在不同的计算机上,相同的初始化编号不需要生成相同的编号。您需要对随机数生成器进行一次种子设定。每次需要不同的序列时,使用具有不同值的srand()
在没有播种的情况下,就好像您发布了一个srand(1)代码>
通常,RNG以当前时间作为初始化值播种在main()
中。time()
返回的当前时间几乎保证在程序的每次运行中都是不同的(每秒更改一次)
#包括
#包括
内部主(空){
srand(时间(0));
/*程序的其余部分;不再调用srand()*/
返回0;
}
请注意,如果使用相同的编号初始化RNG,则会得到相同的序列。这可能很有趣,例如,重复数据
还要注意的是,在不同的计算机上,相同的初始化编号不需要生成相同的编号。此处的RAND_MAX很可能是(2^31)-1(最大32位有符号整数),因此加1会使其换行并变为负值,这反过来意味着p的任何正值都将超过q。更改此项:
return ret/(RAND_MAX+1);
为此:
return ret/((double)RAND_MAX+1.0);
强烈建议对RNG(如前所述)进行种子设定。此处的RAND_MAX很可能是(2^31)-1(最大32位有符号整数),因此添加1会使其换行并变为负值,这反过来意味着p的任何正值都将超过q。更改此项:
return ret/(RAND_MAX+1);
为此:
return ret/((double)RAND_MAX+1.0);
强烈建议对RNG进行种子设定(如前所述)。记住一个要点:每个程序只调用一个srand()
。记住一个要点:只调用一个srand()
每个程序调用。您是说不需要强制转换,因为1.0
将导致整个语句被计算为双精度
?强制转换允许除数的增量超过其默认数据类型的限制。yep。如果不使用强制转换,则有int+double
,并且在添加之前int将被隐式转换为double;通过强制转换(显式转换),您有double+double
,而没有隐式转换。但是演员阵容很难看,很少需要。我同意难看的一点。我记不起求值的方向(实际上遇到了将int+double
求值为int
的编译器)所以我想我是安全的。6.3.1.8通常的算术转换
和6.5.6加法运算符
涵盖了表达式RAND_MAX+1.0
:)中使用的转换,你是说不需要强制转换,因为1.0
会导致整个语句被评估为双精度?强制转换允许除数的增量超过其默认数据类型的限制。yep。如果不使用强制转换,则有int+double
,并且在添加之前int将被隐式转换为double;通过强制转换(显式转换),您有double+double
,而没有隐式转换。但是演员阵容很难看,很少需要。我同意难看的一点。我记不起求值的方向(实际上遇到了将int+double
求值为int
的编译器)所以我想我是安全的。6.3.1.8常用的算术转换
和6.5.6加法运算符
涵盖表达式RAND_MAX+1.0
:)中使用的转换