我想在30到88之间生成100个数字,使得Mean为50,Standard Deviation为16.是否有任何算法可以解决这个问题?
答案 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个数字的算法。