RosettaCodeData/Task/Statistics-Normal-distribution/Yabasic/statistics-normal-distribution.basic
2026-04-30 12:34:36 -04:00

73 lines
1.5 KiB
Text

normalStats(100)
print
normalStats(1000)
print
normalStats(10000)
print
normalStats(100000)
end
sub randomNormal()
local u1, u2
u1 = ran()
u2 = ran()
return cos(2 * pi * u1) * sqrt(-2 * log(u2))
end sub
sub normalStats(n)
local r(n), h(11)
local i, sum, hSum, mean, sd, scale, stars
sum = 0
hSum = 0
// Generate samples: mean 0.5, std 0.25
for i = 1 to n
r(i) = 0.5 + randomNormal() / 4
sum = sum + r(i)
if r(i) < 0 then
h(0) = h(0) + 1
elsif r(i) >= 1 then
h(11) = h(11) + 1
else
h(int(r(i)*10)+1) = h(int(r(i)*10)+1) + 1
fi
next i
for i = 0 to 11
hSum = hSum + h(i)
next i
mean = sum / n
// Standard deviation
sum = 0
for i = 1 to n
sum = sum + (r(i) - mean)^2
next i
sd = sqrt(sum / n)
print "Sample size ", n
print
print " Mean ", mean using("#.######");
print " SD ", sd using("#.######")
print
// Histogram (scale for large samples)
scale = 1
if n > 300 scale = 300 / n
for i = 0 to 11
if i = 0 then
print "< 0.00 : ", h(0) using("#####"), " ";
elsif i = 11 then
print ">=1.00 : ", h(1) using("#####");
else
//print using(" #.## : ##### ", (i-1)/10); h(i);
print " ", (i-1)/10 using("#.##"), " : ", h(i) using("#####"), " ";
fi
stars = int(h(i) * scale + 0.5)
print string$(stars, "*")
next i
end sub