归一随机数分布状态之间的0和1 [0,1)用C

我无法保持随机生成的值被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直到落入该区间。

同时还要注意箱穆勒(您正在使用的算法)很容易实现,这是产生一个高斯随机变量的最坏,最昂贵的方式​​之一。 最好和最快的算法,我知道的是“通灵塔”方法,它的实施可以发现

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

我肯定会创建一个函数来转换“兰特()”归一化的浮点值。 例如:

double
nrand ()
{
return rand()/(RAND_MAX - 1);
}

另外,这里有一些链接,可以帮助:

  • http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx
  • http://people.sc.fsu.edu/~jburkardt/c_src/normal/normal.html
分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • 在绘制热图,并在Matlab中旋转XTICK标签问题或错误的xticklabel_rotate 2015-01-12

    我一直在绘制热图与Matlab中的标签,主要是利用功能于imagesc绘制热图和xticklabel_rotate旋转XTICK标签. (请在这里看到xticklabel_rotate). 它通常效果很好. 但今天我遇到了一些问题,这似乎是由xticklabel_rotate引起的(或者Matlab的文本句柄xticklabel_rotate使用吗?) 为了说明问题,在下面的打印我的代码和代码生成的结果(基本上,它的作用是随机生成一个正态分布的数据矩阵,画出了使用于imagesc的数据的热图,画

  • 在正态分布生成随机的数据中的Java提供的任何功能或相关的库 2012-06-12

    我想生成正态分布随机数据矩阵. 是否有任何Java或相关的功能可以实现这一点. --------------解决方案------------- 这个内置于标准库. 使用Random.nextGaussian()这里定义. 这将返回一个浮点数要服从均值0.0和标准偏差1.0 如果需要从平均分布的随机数m ,标准差s ,用这个表达式: ( Random.nextGaussian() * s ) + m 看一看非普通数学 - 它应该能够提供帮助.

  • 多元正态分布随机分布的OpenCV或纯C# 2012-08-31

    我想知道如果这瓶坯多元正态分布随机分布的函数存在..我搜索,我用C发现它在OpenCV中++ ..我想在C#中..任何机构可以帮助我吗? 谢谢你们 --------------解决方案------------- 看看这个问题. 有一个答案那里列出了一些选项供您.

  • 使用产生观测数据的形状随机对数正态分布 2013-01-11

    我想一些数据拟合对数正态分布,并从该生成使用优化的参数随机对数正态分布. 一些搜索后,我发现了一些解决方案,但没有说服力: 解决方法1使用拟合函数: import numpy as np from scipy.stats import lognorm mydata = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,

  • 正态分布随机整数? 2013-07-15

    有没有一个很好的方式来获得随机产生的整数正态分布? 第一种方法,来MI脑海: int rndi = (int)Math.floor(random.nextGaussian()*std); 有没有更好的办法? 谢谢 --------------解决方案------------- 你应该更新的问题做出清楚正是你的使用情况. 根据你的意见,你不应该使用正态分布的. 相反,尝试了很多离散分布的一个,因为你想在最后的整数. 有很多的,但是我推荐一个 - 很简单的. 它使用随机向量作为离散的概率分布. 这里

  • 随机颜色偏差符合正态分布 2013-08-21

    我想生成一个随机颜色的基础上,原有的色泽和正态分布,这样我就可以创建一个随机纹理告诉脚本"好吧,这是你应该使用一般的颜色,但如果你现在有很大的不同每然后,这很好." 我写在JavaScript中,用箱穆勒变换. 但是,如果我单独使用正态分布上的每个R,G和B值,我得到不想要的尖峰. 如果我的基本颜色是浅灰色,例如,我得到的是非常红,非常绿色或非常蓝色像素. 这是我的脚本到目前为止("0,255"作为最小值和最大值): function randomHex(hex,

  • 从mlogit - [R包提取数正态分布随机系数 2013-11-10

    我使用R中的mlogit包估计与对数正态参数混合Logit模型. 包运行正常,但有没有办法extact随机系数,特别是对于非正态分布的参数? 利用"使用mlogit包肯尼斯列车的练习R"为例,第22页, library(mlogit) data("Electricity", package = "mlogit") Electr <- mlogit.data(Electricity, id = "id", choice =

  • 标准多元正态分布随机向量使用boost ::随机 2014-01-06

    我想在二维表面生成随机点,周围分布X0,Y0坐标. 我的理解是什么,我需要生成被称为"标准多元正态分布随机向量 ",但我不知道如何使用升压::随机库做到这一点在C ++中,例如. 我知道有产生这样的一个algorith,称为箱穆勒变换,但我认为这必须已经正确地执行升压. 有没有产生多元正态分布,使用boost ::随机什么简单的办法? --------------解决方案------------- 好像是: // deterministic Box-Muller method, use

  • 算法在C产生正态分布随机值? 2014-07-23

    可能重复: 转换的均匀分布正态分布 您好. 我想知道在C中实现的任何算法可以采取介于0和1的平均值和标准偏差的随机值,然后返回一个正态分布结果. 我有太多的小脑力,现在摸不着头脑为自己. 我找不到任何在互联网上非常有用. 谢谢. --------------解决方案------------- 还有的已经被建议用于箱穆勒,但计算更简单的方法是简单地利用中心极限定理; 添加足够的独立随机变量一起,并且结果将近似正态分布. 箱穆勒是你需要的转换.

  • 如何生成正态分布随机从一个整数的范围? 2014-09-19

    由于开始和一个整数的范围到底,我该如何计算在这个范围正态分布随机整数? 我认识到,正态分布进入 - +无穷大. 我猜的尾巴可以截止,所以当随机得到的范围内,重新计算之外计算. 此升高的范围内的整数的概率,但只要这种效果是可以容忍的(<5%),它的罚款. public class Gaussian { private static bool uselast = true; private static double next_gaussian = 0.0; private static Rando

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.364 (s). 10 q(s)