如何使用预定义的平均值和标准偏差生成给定范围内的N个数字

时间:2013-04-24 14:55:33

标签: c algorithm

我想在30到88之间生成100个数字,使得Mean为50,Standard Deviation为16.是否有任何算法可以解决这个问题?

3 个答案:

答案 0 :(得分:0)

我在this论坛中找到了以下算法。

我知道它是用Perl编写的,并且你用C标记了你的问题,但算法很清楚,它完全符合你的要求。

#!/usr/bin/perl -w
use strict;

my $desired_mean = 250;
my $desired_deviation = 20;
my $total = 1000;

my @numbers;

gen_numbers(\@numbers, $desired_mean, $desired_deviation, $total);

sub gen_numbers {
   my ($array_ref, $mean, $deviation, $total) = @_;
   my $offset = $deviation * 1.75;
   my $low = $mean - $offset;
   my $high = $mean + $offset;
   for (0 .. $total) {
       my $number;
       while (1) {
            $number = int(rand($high)) + 1;
            last if ($number >= $low && $number <= $high);
       }

       push @{$array_ref} , $number
   }
}

my $sum;
$sum += $_ for @numbers;

my $mean = $sum / $total;

my $scratch;
for (@numbers) {
   $scratch += (($_ - $mean) * ($_ - $mean));
}

my $standard_deviation = sqrt($scratch / ($total - 1));

print "Desired Mean:  $desired_mean\n";
print "Mean:  $mean\n";
print "\n";
print "Desired Standard Deviation:  $desired_deviation\n";
print "Standard Deviation:  $standard_deviation\n";
__END__
Desired Mean:  250
Mean:  250.06707

Desired Standard Deviation:  20
Standard Deviation:  19.9571308028178

如果您不理解代码或算法,请告诉我。祝你好运!

答案 1 :(得分:0)

100号66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66, 66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66, 66,66,66,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, 34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, 34,34和34在30和88之间,平均值为50,标准偏差为16。

生成它们的方法很明显。我怀疑你的实际问题还有其他你未说过的标准。

答案 2 :(得分:0)

我认为你真的不想生成100个数字;我假设您需要一种算法,在给定的边界之间生成随机数,具有给定的均值和标准差。

您可以尝试生成具有正态分布的数字(由@Robert Harvey建议),并丢弃超出范围的数字。在伪代码中:

do {
    x = Generate_Random_Number_Normal_Distribution(mean = 50, STD = y);
} while (!(x >= 30 && x <= 88));

如果y = 16,结果的标准偏差会略小于您想要的。为了获得所需的标准偏差,您必须增加y参数。

但增加多少?您可以通过反复试验来确定这一点:测试y的不同值,例如1000000个数字,计算它们的标准偏差,并查看它是否足够接近您想要的值。

在找到y之后,将其设为常数,您将获得一个生成50个数字的算法。