|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
POV-Ray's random number generator gives uniformly distributed real numbers.
Any idea how to transform these into normally distributed numbers?
Andrew @ home.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Andrew C on Mozilla <voi### [at] devnull> wrote:
> POV-Ray's random number generator gives uniformly distributed real numbers.
Actually no. It gives uniformly distributed real numbers between 0 and 1,
which is a slightly different thing.
(And we can also split hairs by noting that floating points numbers aren't
real numbers but a finite set of rational numbers, but would not be relevant
here... :) )
> Any idea how to transform these into normally distributed numbers?
You can approximate a normal distribution of numbers between 0 and 1
by taking the sum of n equally-distributed numbers and dividing the
result by n. The higher the n, the more closely it resembles normal
distribution, but for practical purposes you don't need a very large n.
Even n=3 already gives a pretty good distribution.
--
#macro N(D)#if(D>99)cylinder{M()#local D=div(D,104);M().5,2pigment{rgb M()}}
N(D)#end#end#macro M()<mod(D,13)-6mod(div(D,13)8)-3,10>#end blob{
N(11117333955)N(4254934330)N(3900569407)N(7382340)N(3358)N(970)}// - Warp -
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Warp <war### [at] tagpovrayorg> wrote:
> You can approximate a normal distribution of numbers between 0 and 1
> by taking the sum of n equally-distributed numbers
(which are between 0 and 1, of course)
--
plane{-x+y,-1pigment{bozo color_map{[0rgb x][1rgb x+y]}turbulence 1}}
sphere{0,2pigment{rgbt 1}interior{media{emission 1density{spherical
density_map{[0rgb 0][.5rgb<1,.5>][1rgb 1]}turbulence.9}}}scale
<1,1,3>hollow}text{ttf"timrom""Warp".1,0translate<-1,-.1,2>}// - Warp -
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
in news:40995621@news.povray.org Andrew C on Mozilla wrote:
> Any idea how to transform these into normally distributed numbers?
>
From "rand.inc"
Rand_Normal(Mu, Sigma, Stream). Normal distribution.
Parameters:
Mu = Mean.
Sigma = Standard deviation.
Stream = Random number stream.
Rand_Gauss(Mu, Sigma, Stream). Gaussian distribution. Like Rand_Normal
(), but a bit faster.
Parameters:
Mu = Mean.
Sigma = Standard deviation.
Stream = Random number stream.
Ingo
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
-[You can approximate a normal distribution of numbers...]-
...but this is an inefficient method. The standard method is the Box-Muller
transform, given here in C.
float v1,v2,rsq,fac;
do
{
v1=rand()*2.0-1.0; v2=rand()*2.0-1.0;
rsq=v1*v1+v2*v2;
} while (rsq>=1.0 || rsq==0.0)
fac=sqrt(-2.0*log(rsq)/rsq);
This generates two independent normal deviates (v1*fac) and (v2*fac) (with
zero mean and unit variance). The "rand()" function here generates uniform
deviates between 0 and 1.
-[...and dividing the result by n]-
Actually, with this method you need to divide by sqrt(n) if you want to keep
the variance independent of n.
-Chris
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
>>POV-Ray's random number generator gives uniformly distributed real numbers.
>
> Actually no. It gives uniformly distributed real numbers between 0 and 1,
> which is a slightly different thing.
Well yeah, but you know what I *mean* ;-)
> (And we can also split hairs by noting that floating points numbers aren't
> real numbers but a finite set of rational numbers, but would not be relevant
> here... :) )
True. (I do recall asking how far apart these numbers are, but never
really got an answer...)
>>Any idea how to transform these into normally distributed numbers?
>
> You can approximate a normal distribution of numbers between 0 and 1
> by taking the sum of n equally-distributed numbers and dividing the
> result by n. The higher the n, the more closely it resembles normal
> distribution, but for practical purposes you don't need a very large n.
> Even n=3 already gives a pretty good distribution.
...because the means of different samples from a given population are
normally distributed around the true mean of the population? (And the
true mean of a *truely* uniform distribution from 0 to 1 would be 0.5)
Andrew @ home.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
> From "rand.inc"
>
> Rand_Normal(Mu, Sigma, Stream). Normal distribution.
> Parameters:
> Mu = Mean.
> Sigma = Standard deviation.
> Stream = Random number stream.
>
> Rand_Gauss(Mu, Sigma, Stream). Gaussian distribution. Like Rand_Normal
> (), but a bit faster.
> Parameters:
> Mu = Mean.
> Sigma = Standard deviation.
> Stream = Random number stream.
Ah... yes, that's easier! ;-)
Andrew @ home
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
-[I do recall asking how far apart these numbers are]-
Pov-ray uses the IEEE double floating point standard (unless you're
compiling it on a DEC VAX or something obscure), which has 52 bits of
fractional precision, which gives about 2^-52 as the distance between random
numbers. However, pov-ray actually uses a 32-bit linear congruential random
number generator, which only uses 32 bits of precision.
-[because the means of different samples from a given population are
normally distributed around the true mean of the population]-
Yes - or rather, they approach a normal distribution as the number in each
sample tends to infinity (the Central Limit Theorem)
-Chris
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
In article <4099991b$1@news.povray.org>,
"Chris Johnson" <chris(at)chris-j(dot)co(dot)uk> wrote:
> -[You can approximate a normal distribution of numbers...]-
> ...but this is an inefficient method. The standard method is the Box-Muller
> transform, given here in C.
If you can easily generate a few random numbers and don't need a very
close approximation, the averaging method can be faster. The problem
isn't really efficiency, it's accuracy...the result isn't all that close
to a normal distribution unless you use lots of points and rescale the
numbers to get out of the range of the original numbers.
> -[...and dividing the result by n]-
> Actually, with this method you need to divide by sqrt(n) if you want to keep
> the variance independent of n.
In the places where this approximation is used, that is rarely a
problem. It's often more useful to have a known range that the random
numbers are limited to. It's a very fast and easy way to get objects to
bunch up around a point with a roughly Gaussian distribution.
--
Christopher James Huff <cja### [at] earthlinknet>
http://home.earthlink.net/~cjameshuff/
POV-Ray TAG: <chr### [at] tagpovrayorg>
http://tag.povray.org/
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
In article <409aa06c@news.povray.org>,
"Chris Johnson" <chris(at)chris-j(dot)co(dot)uk> wrote:
> -[I do recall asking how far apart these numbers are]-
> Pov-ray uses the IEEE double floating point standard (unless you're
> compiling it on a DEC VAX or something obscure), which has 52 bits of
> fractional precision, which gives about 2^-52 as the distance between random
> numbers.
Not quite correct. You're forgetting that floating point numbers are not
fixed point...they're quite a bit more complicated. In addition to the
52-bit plus-one mantissa, IEEE 754 double precision numbers also have an
11 bit exponent, which can go down to -1023 and up to 1024. You end up
with a pretty complex distribution of possible numbers...just how big a
step there is between a value and the next possible larger or smaller
value depends on what that value is.
> However, pov-ray actually uses a 32-bit linear congruential random
> number generator, which only uses 32 bits of precision.
At most, it may be even less. Assuming it fills the entire 32 bit range,
that gives you 2^32 steps, 4294967296 steps with 2.328306436538696e-10
between each step.
--
Christopher James Huff <cja### [at] earthlinknet>
http://home.earthlink.net/~cjameshuff/
POV-Ray TAG: <chr### [at] tagpovrayorg>
http://tag.povray.org/
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |