//简单看了一下,其实很简单 //你把下面这句话写成全局静态属性 static Random aa = new Random((int)(DateTime.Now.Ticks/10000)); 原理是, 用构造虽然使用了随机数,但是在For循环的时候可能在1微秒以内就已经执行结束了. 你产生的aa这个对象其实是同一时间的产物 自然产生的随机数也是一样的..
以下是你的代码的修改版: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(); } }
兄台,我想随机500到900的数,为什么miu改为6或者更大时出错呢,“integer divide by zero”,还望回复,谢谢
//简单看了一下,其实很简单
//你把下面这句话写成全局静态属性
static Random aa = new Random((int)(DateTime.Now.Ticks/10000));
原理是, 用构造虽然使用了随机数,但是在For循环的时候可能在1微秒以内就已经执行结束了. 你产生的aa这个对象其实是同一时间的产物 自然产生的随机数也是一样的..
以下是你的代码的修改版: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();
}
}