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毫秒