C#Random得随机数求均值、方差、正态分布

06年遥感上机复试的程序:

请用VC或C编写以下程序:正态分布随机数的产生。

步骤如下:

(1)利用随机函数rand()生成(0,1)区间的100个均匀分布随机数;

提示:首先利用“srand((unsigned)time(NULL)) ”语句设置产生随机数的开始点(需要包含time.h头文件);产生随机数的函数为rand(),为了将该随机数转换为(0,1)范围内的数,利用“rand()*1.0/RAND_MAX”可实现此目的。

(2)计算这100个均匀分布随机数的均值和方差,计算公式如下:

(3)将这100个均匀分布的随机数,及其均值和方差保存到文本文件“c:\temp\SourceData.txt”中;

(4)读入“SourceData.txt”中的100个均匀分布的随机数,利用正态分布随机数的产生函数生成正态分布随机数。正态分布随机数生成函数如下:

其中,自变量x即为从“SourceData.txt”文件中读入的100个均匀分布的随机数。

    (5)计算在第(4)步计算出100个正态分布随机数y的均值和方差。

    (6)将计算出的100个正态分布随机数,及其均值和方差保存到文件“c:\temp\ResultData.txt”中。

评分标准:

(1)能正确的生成100个(0,1)区间的均匀分布随机数,并计算其均值和方差:20分。

(2)能够正确地将这100个均匀分布随机数,及其均值和方差保存到文本文件“SourceData.txt”中:10分。

(3)能将“SourceData.txt”中的100个均匀分布的随机数正确的读入自定义的数组:20分。

(4)能正确利用正态分布随机数的产生函数生成100个正态分布随机数,并计算其均值和方差:20分

(5)能够正确地将这100个均匀分布随机数,及其均值和方差保存到文本文件“ResultData.txt”中:20分。

(6)代码符合编码规范,包括命名规范、注释清楚、代表排列层次清楚等:20分。

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;

namespace random
{
class Program
{

// 求随机数平均值方法
static double Ave( double [] a)
{
double sum = 0 ;
foreach ( double d in a)
{

sum
= sum + d;
}
double ave = sum / a.Length;

return ave;
}
// 求随机数方差方法
static double Var( double [] v)
{
// double tt = 2;
// double mm = tt ^ 2;

double sum1 = 0 ;
for ( int i = 0 ; i < v.Length; i ++ )
{
double temp = v[i] * v[i];
sum1
= sum1 + temp;

}

double sum = 0 ;
foreach ( double d in v)
{
sum
= sum + d;
}

double var = sum1 / v.Length - (sum / v.Length) * (sum / v.Length);
return var;
}

// 求正态分布的随机数
static void Fenbu( double [] f)
{
// double fenbu=new double[f.Length ];
for ( int i = 0 ; i < f.Length; i ++ )
{
double a = 0 , b = 0 ;
a
= Math.Sqrt(( - 2 ) * Math.Log(f[i], Math.E));
b
= Math.Cos( 2 * Math.PI * f[i]);
f[i]
= a * b * 0.3 + 1 ;

}

}

static void Main( string [] args)
{

// 生成100个(0,1)之间的随机数
Random ran = new Random();
double [] dou = new double [ 100 ];
for ( int i = 0 ;i < dou.Length;i ++ )
{
dou[i]
= ran.NextDouble();

}

// 调用Ave方法、Var方法求得随机数均值和方差
double avenum = Ave(dou);
double varnum = Var(dou);

// 写入文件
// 将100个随机数,均值,方差保存到文件“d:\C#练习\SourceData.txt”中
string Datapath = ( @" d:\C#练习\SourceData.txt " );

FileStream fs
= new FileStream(Datapath, FileMode.Create);
StreamWriter sw
= new StreamWriter(fs);

for ( int j = 0 ; j < dou.Length;j ++ )
{
sw.WriteLine(dou[j]);

}

sw.Write(
" 100个随机数均值和方差分别是{0}和{1} " ,avenum,varnum);
sw.Close();


// 读取数据文件“d:\C#练习\SourceData.txt”
FileStream fs1 = new FileStream(Datapath, FileMode.Open);
StreamReader sr
= new StreamReader(fs1);
string temp = null ;
string str = null ;
while ((temp = sr.ReadLine()) != null )
{
str
= str + temp + " " ;
}

// 对数组进行分割Regax
Regex re = new Regex( " " );
string [] str1 = re.Split(str);
double [] nums = new double [str1.Length - 2 ];

for ( int i = 0 ;i < str1.Length - 2 ;i ++ )
{

nums[i]
= Convert.ToDouble(str1[i]);
}

// 调用正态分布随机函数,求均值和方差
Fenbu(nums);
double averesult = Ave(nums);
double varresult = Var(nums);

// 写入文件
// 将100个随机数,均值,方差保存到文件“d:\C#练习\ResultData.txt”中
string Resultpath = ( @" d:\C#练习\ResultData.txt " );

FileStream fs2
= new FileStream(Resultpath, FileMode.Create);
StreamWriter sw1
= new StreamWriter(fs2);

for ( int j = 0 ; j < nums.Length; j ++ )
{
sw1.WriteLine(nums[j]);

}

sw1.Write(
" 100个随机数均值和方差分别是{0}和{1} " , averesult, varresult);
sw1.Close();

Console.ReadKey();

}
}
}

 

转载于:https://www.cnblogs.com/WHTYBC/archive/2010/03/23/1692359.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值