Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 使用随机数rand()计算数字_C_Random - Fatal编程技术网

C 使用随机数rand()计算数字

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 =

我正在学习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 = 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
:)中使用的转换