关于在给定的范围内生成正态分布的随机数 ( 积分: 200 )

  • 主题发起人 主题发起人 wdjlover
  • 开始时间 开始时间
W

wdjlover

Unregistered / Unconfirmed
GUEST, unregistred user!
现在想实现这么一个功能,已知有1000各学生的成绩,现在取出50个学生的成绩作为样本,计算平均值和标准偏差并且可以得到50各数据中的最大值和最小值,然后利用RandG(平均数,标准偏差)函数 生成1000个数据,必须保证这1000个数据再上面得到的最大值和最小值之间。成绩都是整数。 希望各位富翁能够给点宝贵意见!急!
 
现在想实现这么一个功能,已知有1000各学生的成绩,现在取出50个学生的成绩作为样本,计算平均值和标准偏差并且可以得到50各数据中的最大值和最小值,然后利用RandG(平均数,标准偏差)函数 生成1000个数据,必须保证这1000个数据再上面得到的最大值和最小值之间。成绩都是整数。 希望各位富翁能够给点宝贵意见!急!
 
高手们都不知道怎么解决吗? 还请各位高手不吝赐教阿!!
 
不知道有何问题?
楼主思路很清晰么:)
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3058679
看这个帖子,里面有我的一个randg的Demo演示
 
MeanAndStdDev计算平均值和标准偏差
MaxValue最大值
MinValue最小值
 
to dawnsong
你的程序在法这个帖子之前 我也看过了 我现在可以求出来平均数和标准偏差,比如平均数等于50,标准偏差=20,并且已知最大数和最小数假如是2和92。 我用randg(50,20)生成了 1000个数 但是有很多数是在2-92之外的,我想把在2-29之外的数都映射到这个范围之内。我就是不知道该用什么算法来实现。你的程序映射部分我看得很迷糊,可能是太笨了,你能用我上边给出的数据,帮我写一个算法吗? 万分感谢!
 
把在2-29之外的数都映射到这个范围之内
-------------------------------------
那这1000个数可能就不再是正态分布了,如果一定要的话,简单映射如下:
const
minV:Integer =2;
maxV:Integer =92;
var
i:Integer;
x:Integer;
begin
for i:=1 to 1000do
begin
x :=Round(RandG(50,20));
if x>maxV then
x :=minV +x mod (maxV-minV)//大于最大值,简单求模映射,能够保证映射到minV~maxV
else
if x<minV then
begin
while x<maxVdo
Inc(x,maxV);
x :=minV +x mod (maxV-minV);
end;

Memo1.Lines.Insert(0,IntToStr(x));
end;
end;
 
实际学生人数可能在几千到10000人左右 不知道这个映射能不能满足需求。有没有别的方法 可以减少应设过程中的误差呢?而且能够保证平均数能够和样本数据算出的平均数差别不大。
 
想把1000(或更多)个人放到2-92之间 的目的是以后要计算某个学生在总人数的排名。
 
周日早上结帖 希望各位富翁能够在帮小弟想想办法和算法 谢谢
 
既然不是手工计算,为何还要抽取50个作为样本呢?
全部计算一下,不是更加精确么?
----------------------------------------------------------------------------
想把1000(或更多)个人放到2-92之间 的目的是以后要计算某个学生在总人数的排名。
使用了RandG来生成随机数据,不懂楼主如何计算排名?这些随机数据有什么用?
 
实际考试人数大概在10000人左右 但是只能提供最到1/3得学生的考试成绩,因此其余2/3德人的成绩只能制作成假数据 但是这些数据还必须满足一种正态分布的趋势。这样说能明白吗?
 
to dawnsong
希望大侠能继续关注此帖
 
接受答案了.
 
后退
顶部