c语言编写的对数正态分布改用c#编写

longquan880 2010-04-10 03:32:06
C语言源码如下:

/****************************************************
产生N=100个在(0,50)区间内满足对数正态分布的随机数
/*****************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define N 100
#define MAX 50
#define MIN 0.1
#define MIU 2
#define SIGMA 1
#define PI 3.14159

double AverageRandom(double min,double max)//产生(min,max)之间均匀分布的随机数
{
int MINnteger = (int)(min*10000);
int MAXnteger = (int)(max*10000);
int randInteger = rand()*rand();
int diffInteger = MAXnteger - MINnteger;
int resultInteger = randInteger % diffInteger + MINnteger;
return resultInteger/10000.0;
}
double LogNormal(double x,double miu,double sigma) //对数正态分布概率密度函数
{
return 1.0/(x*sqrt(2*PI)*sigma) * exp(-1*(log(x)-miu)*(log(x)-miu)/(2*sigma*sigma));
}
double Random_LogNormal(double miu,double sigma,double min,double max)//产生对数正态分布随机数
{
double x;
double dScope;
double y;
do
{
x = AverageRandom(min,max);
y = LogNormal(x, miu, sigma);
dScope = AverageRandom(0, LogNormal(miu,miu,sigma));
}while( dScope > y);
return x;
}
void main(void)
{
srand(time(NULL));
int i,j;
for(i=0,j=0;i<N;i++)
{
printf("%14f", Random_LogNormal(MIU,SIGMA,MIN,MAX));
j++;
if(j==5)
{
printf("\n"); //每行显示5个数
j=0;
}

}
}


想把上面代码改用C#编写,但是随机数产生有些问题,用C写的程序srand(time(NULL));输出的100个数是不同的。
用C#写的程序输出结果相同。

下面是我C#源码
using System;
using System.Collections.Generic;
using System.IO;

class Program
{

///****************************************************
/// 产生N=100个在(0,50)区间内满足对数正态分布的随机数
///*****************************************************/

const int N = 100;
const int MAX = 50;
const double MIN = 0.1;
const int MIU = 2;
const int SIGMA = 1;

static double AverageRandom(double min, double max)//产生(min,max)之间均匀分布的随机数
{
int MINnteger = (int)(min * 10000);
int MAXnteger = (int)(max * 10000);

//Random aa = new Random(unchecked((int)DateTime.Now.Ticks));
//Random bb = new Random(~unchecked((int)DateTime.Now.Ticks));
// Random rdm1 = new Random(unchecked((int)DateTime.Now.Ticks));
// Random rdm2 = new Random(~unchecked((int)DateTime.Now.Ticks));
//int randInteger = aa.Next(0, 2147483647) * bb.Next(0, 2147483647);
//int diffInteger = MAXnteger - MINnteger;
//int resultInteger = randInteger % diffInteger + MINnteger;
Random aa = new Random(unchecked((int)DateTime.Now.Ticks));
int resultInteger = aa.Next(MINnteger, MAXnteger);
return resultInteger / 10000.0;
}
static double LogNormal(double x, double miu, double sigma) //对数正态分布概率密度函数
{
return 1.0 / (x * Math.Sqrt(2 * Math.PI) * sigma) * Math.Exp(-1 * (Math.Log(x) - miu) * (Math.Log(x) - miu) / (2 * sigma * sigma));
}
static double Random_LogNormal(double miu, double sigma, double min, double max)//产生对数正态分布随机数
{
double x;
double dScope;
double y;
do
{

x = AverageRandom(min, max);
y = LogNormal(x, miu, sigma);
dScope = AverageRandom(0, LogNormal(miu, miu, sigma));
} while (dScope > y);
return x;
}
static void Main()
{
int i, j;
for (i = 0, j = 0; i < N; i++)
{
double x = Random_LogNormal(MIU, SIGMA, MIN, MAX);
Console.Write(x);
// System.Threading.Thread.Sleep(1000);
j++;
if (j == 5)
{
Console.Write("\n"); //每行显示5个数
j = 0;
}

}
Console.ReadLine();
}
}



C#的随机种子一直没搞清楚,我知道是根据时间来生成的,但是C里面也是根据时间,为什么C#生成的是相同的数呢。。。
...全文
525 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengqian8928 2010-06-03
  • 打赏
  • 举报
回复
兄台,我想随机500到900的数,为什么miu改为6或者更大时出错呢,“integer divide by zero”,还望回复,谢谢
人工智能算法 2010-04-10
  • 打赏
  • 举报
回复

以下是你的代码的修改版:



using System;
using System.Collections.Generic;
using System.IO;

class Program
{

///****************************************************
/// 产生N=100个在(0,50)区间内满足对数正态分布的随机数
///*****************************************************/

const int N = 100;
const int MAX = 50;
const double MIN = 0.1;
const int MIU = 2;
const int SIGMA = 1;
static Random aa = new Random((int)(DateTime.Now.Ticks / 10000));

static double AverageRandom(double min, double max)//产生(min,max)之间均匀分布的随机数
{
int MINnteger = (int)(min * 10000);
int MAXnteger = (int)(max * 10000);

//Random aa = new Random(unchecked((int)DateTime.Now.Ticks));
//Random bb = new Random(~unchecked((int)DateTime.Now.Ticks));
// Random rdm1 = new Random(unchecked((int)DateTime.Now.Ticks));
// Random rdm2 = new Random(~unchecked((int)DateTime.Now.Ticks));
//int randInteger = aa.Next(0, 2147483647) * bb.Next(0, 2147483647);
//int diffInteger = MAXnteger - MINnteger;
//int resultInteger = randInteger % diffInteger + MINnteger;
int resultInteger = aa.Next(MINnteger, MAXnteger);
return resultInteger / 10000.0;


}
static double LogNormal(double x, double miu, double sigma) //对数正态分布概率密度函数
{
return 1.0 / (x * Math.Sqrt(2 * Math.PI) * sigma) * Math.Exp(-1 * (Math.Log(x) - miu) * (Math.Log(x) - miu) / (2 * sigma * sigma));
}
static double Random_LogNormal(double miu, double sigma, double min, double max)//产生对数正态分布随机数
{
double x;
double dScope;
double y;
do
{

x = AverageRandom(min, max);
y = LogNormal(x, miu, sigma);
dScope = AverageRandom(0, LogNormal(miu, miu, sigma));
} while (dScope > y);
return x;
}
static void Main()
{
int i, j;
for (i = 0, j = 0; i < N; i++)
{
double x = Random_LogNormal(MIU, SIGMA, MIN, MAX);
Console.Write(x);
// System.Threading.Thread.Sleep(1000);
j++;
if (j == 5)
{
Console.Write("\n"); //每行显示5个数
j = 0;
}

}
Console.ReadLine();
}
}





人工智能算法 2010-04-10
  • 打赏
  • 举报
回复

//简单看了一下,其实很简单
//你把下面这句话写成全局静态属性
static Random aa = new Random((int)(DateTime.Now.Ticks/10000));


原理是, 用构造虽然使用了随机数,

但是在For循环的时候可能在1微秒以内就已经执行结束了.

你产生的aa这个对象其实是同一时间的产物 自然产生的随机数也是一样的..
longquan880 2010-04-10
  • 打赏
  • 举报
回复
没人啊,自己已经解决了,我用的办法是把C的封装成dll,然后在C#中调用。

期待有人直接用c#来写,分就给你啦!!!

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧