gpt4 book ai didi

c - C 中 0 和 1 [0, 1) 之间的归一化随机数分布

转载 作者:行者123 更新时间:2023-12-02 02:19:35 24 4
gpt4 key购买 nike

我无法保留随机生成的值,这些值通常分布在 0 和 1 之间(包括 0,不包括 1)。我相信算法基本上是正确的,我只是被难住了。任何见解都会很棒。

这些是需要的包含文件:

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

正态分布的随机数生成函数:

float rand_normal(float mean, float stddev) 
{
static float n2 = 0.0;
float x, y, r;
static int n2_cached = 0;
if (!n2_cached)
{
do
{
x = 2.0*rand()/RAND_MAX - 1;
y = 2.0*rand()/RAND_MAX - 1;
r = x*x + y*y;
} while (r==0.0 || r>1.0);
float d = sqrt(-2.0*log(r)/r);
float n1 = x*d;
float result = n1*stddev + mean;
n2 = y*d;
n2_cached = 1;
return result;
}
else
{
n2_cached = 0;
return n2*stddev + mean;
}
}

主要功能仅用于测试目的。

int main()
{
srand(time(NULL));
int i;
float min = 0.5, max = 0.5, r, avg = 0;
float x, w;
int n = 10000000;
for (i=0; i<n; i++)
{
r = rand_normal(0.5, 0.09);
if (r < min)
min = r;
else if ( r>max)
max = r;
avg += r;
}
avg /= (float)n;
printf("min = %f\nmax = %f\navg = %f\n", min, max, avg);
return 0;
}

如果有人想知道,“植物中的遗传遗传”模拟需要此函数。

最佳答案

为什么您希望结果保持在 0 和 1 之间?高斯分布得到完全支持,因此无论您查看的区间是什么,无论您选择的均值和方差是什么,落在该区间之外的概率总是(可能性非常小)非零。如果出于某种原因你真的想将自己限制在 [0,1],那么你可以简单地调用 rand_normal 直到你落入那个区间。

另请注意,虽然 Box-Müller(您正在使用的算法)易于实现,但这是生成高斯随机变量的最差且成本最高的方法之一。我所知道的最好和最快的算法是“Ziggurat”方法,可以在以下位置找到它的实现

http://www.seehuhn.de/pages/ziggurat

关于c - C 中 0 和 1 [0, 1) 之间的归一化随机数分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com