Programming 版 (精华区)
发信人: JJason (总统~~), 信区: Programming
标 题: [合集]c语言里面的随机函数是不是正态分布的?
发信站: 哈工大紫丁香 (2003年03月20日17:11:35 星期四), 站内信件
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月01日16:58:11 星期六 说道:
如果要生成zipf分布的,有什么办法?
────────────────────────────────────────
balance (呼吸·一剪梅·半个吻) 于 2003年03月01日16:59:21 星期六 说道:
~~~~?是什么?
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月01日16:59:38 星期六 说道:
我也想知道
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月01日16:59:42 星期六 说道:
应该是近似正态分布,所以都叫伪随机数嘛。
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月01日16:59:59 星期六 说道:
zip format? haha
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月01日17:01:15 星期六 说道:
不是
────────────────────────────────────────
Anna (冷冷星光+|+忧伤) 于 2003年03月01日17:11:49 星期六 说道:
是这个?
anna摘自
http://periodicals.wanfangdata.com.cn/lwtj.asp?lmmc=wxzs&ID=1627
齐普夫定律
齐普夫定律是由美国学者G.K.齐普夫于本世纪40年代提出的词频分布定律。它
可以表述为:如果把一篇较长文章中每个词出现的频次统计起来,按照高频词在前
、低频词在后的递减顺序排列,并用自然数个这些词编上的等级序号,即频次最高
的词等级为1,频次次之的等级为2,......,频次最小的词等级为D,。若用f表示
频次,r 表示序号,则有fr=C(C为常数)。人们称该式为齐普夫定律。
2001年10月25日
────────────────────────────────────────
xceman (辉->伪狼*谎称羔羊) 于 2003年03月01日17:50:32 星期六 说道:
我也想知道
:)
────────────────────────────────────────
deem (沙丘男爵) 于 2003年03月01日17:57:34 星期六 说道:
应该是平均分部吧?要是正态分布就不能叫做随机的了
────────────────────────────────────────
zhangyan (what are they doing?) 于 2003年03月02日09:22:08 星期天 说道:
不是吧?hehe
伪随机是因为计算机做不出真正的随机数
────────────────────────────────────────
kylix (无法温柔) 于 2003年03月02日09:47:37 星期天 说道:
对,近似均匀分布
────────────────────────────────────────
JJason (总统~~) 于 2003年03月02日09:50:57 星期天 说道:
我觉得也应该是均匀分布;
要其他的随机数得自己编写程序吧
────────────────────────────────────────
templer (找个好陪练) 于 2003年03月02日10:28:24 星期天 说道:
先写个程序,让他生成n(n很大)个随机数,然后进行统计,就知道是
正态分布还是均匀分布了
────────────────────────────────────────
flythunder (似是故人来) 于 2003年03月02日11:03:13 星期天 说道:
随机指的是一种信号的形式
与确定相对立的
分布有很多种,
均匀,正态,指数 ,瑞利 ……
但这些都属于 随机
产生的方法有所不同,
────────────────────────────────────────
Unknow (Unknown) 于 2003年03月02日12:37:15 星期天 说道:
C语言中的随机数 是均匀分布的
但是,可以在这个基础上构造出任意分布。
只要知道这个函数的概率密度表达式就可以了
────────────────────────────────────────
Timoshenko (嘴很甜) 于 Sun Mar 2 13:39:20 2003) 说道:
当然不是了,机会所有的随机书发生器都只能生成均匀分布,但好在有这样一个定律:任
两种随机数都可以通过函数变换互相转化。
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月02日14:45:04 星期天 说道:
怎么转化?
────────────────────────────────────────
flythunder (似是故人来) 于 2003年03月02日15:06:30 星期天 说道:
要知道概率密度函数或者分布函数的
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月02日15:13:13 星期天 说道:
知道这个函数,假定是f
────────────────────────────────────────
leecxws (lovekiller) 于 2003年03月02日15:25:57 星期天 说道:
计算机中的随即数是均匀分布的[random()],但不是[0,1]之间的分布,常用的是
[0,1]之间的均匀分布,下面给你一个参考程序产生[0,1]均匀分布随机数:
[a,b]可以这样: yourrandomnumber=a+(b-a)*x;其中x是本程序产生的。
均匀分布可以这样:设x1....x12是[0,1]均匀分布数,x=(x1+x2+...+x12)-6;则
x是均值为0,方差为1的正态分布随机数,再利用:x'=x*sigma+a;可以得
均值为a,方差为sigma的正态分布数。
#include<stdio.h>
#define N 624
#define M 397
#define MATRIX_A 0x9908b0df
#define UPPER_MASK 0x80000000
#define LOWER_MASK 0x7fffffff
#define TEMPERING_MASK_B 0x9d2c5680
#define TEMPERING_MASK_C 0xefc60000
#define TEMPERING_SHIFT_U(y) (y >> 11)
#define TEMPERING_SHIFT_S(y) (y << 7)
#define TEMPERING_SHIFT_T(y) (y << 15)
#define TEMPERING_SHIFT_L(y) (y >> 18)
static unsigned long mt[N];
static int mti;
double ran_uniform__()
{
unsigned long y;
static unsigned long mag01[2]={0x0, MATRIX_A};
double zzz=2.0;
while (zzz < 0.0000000000001e0 || zzz > 0.9999999999999e0)
{
if (mti >= N)
{
int kk;
for (kk=0;kk<N-M;kk++)
{
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
}
for (;kk<N-1;kk++)
{
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
}
y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];
mti = 0;
}
y = mt[mti++];
y ^= TEMPERING_SHIFT_U(y);
y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B;
y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C;
y ^= TEMPERING_SHIFT_L(y);
zzz = ((double)y/(unsigned long)0xffffffff);
}
return(zzz);
}
void genrand_(double *seed)
{
unsigned long myint;
int kk;
double dummy;
myint = (unsigned long)((*seed)*429496729);
myint = myint + 1000;
if (myint%2 == 0)
myint = myint + 1;
else
myint = myint + 2;
mt[0]= myint & 0xffffffff;
for (mti=1; mti<N; mti++)
mt[mti] = (69069 * mt[mti-1]) & 0xffffffff;
for (kk=1; kk<10000; kk++)
dummy = ran_uniform__();
return;
}
────────────────────────────────────────
PowerStation (人若无名便可专心发电) 于 2003年03月02日19:55:22 星期天 说道:
我说错了,是平均分布 :)
────────────────────────────────────────
tth (bear) 于 2003年03月02日21:25:39 星期天 说道:
//由均匀分布的随机数得到正态分布的随机数
#include <math.h>
float gasdev(idum)
int *idum;
{
static int iset=0;
static float gset;
float fac,r,v1,v2;
float ran1();//产生均匀分布的随机数,可利用系统函数改写
if (iset == 0) {
do {
v1=2.0*ran1(idum)-1.0;
v2=2.0*ran1(idum)-1.0;
r=v1*v1+v2*v2;
} while (r >= 1.0);
fac=sqrt(-2.0*log(r)/r);
gset=v1*fac;
iset=1;
return v2*fac;
} else {
iset=0;
return gset;
}
}
原理可找本数值算法方面的书看看。
────────────────────────────────────────
ssos (存在与虚无·守拙) 于 2003年03月02日21:45:33 星期天 说道:
要得就是这个算法:D
────────────────────────────────────────
tth (bear) 于 2003年03月02日21:55:45 星期天 说道:
呵呵!^_^
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.722毫秒