|  | Posted by C. (http://symcbean.blogspot.com/) on 02/01/08 13:31 
On 31 Jan, 19:29, The Natural Philosopher <a...@b.c> wrote:> Fred wrote:
 > > Hi guys,
 >
 > > I was wondering how could i get a random number exemple between 1 and
 > > 100 but with n% of getting some value over a number x.
 >
 > > Thanks a lot in advance.
 >
 > > Fred
 >
 > Never mind Jerry, No one else does.
 >
 > So you want a random number from a weighted distribution?
 >
 > Your spec doesn't contain quite enough data to formulate the formula,
 > since there are an infinite number of distributions that have N% over
 > value X..
 >
 > One example, is that you first of all get a random number between 0 and
 > 100: If this is greater than N, then select a random number greater than
 > X, else select one less than X.
 >
 > So in pseudo code where RAND(X) returns a number  between 0 and X-1...
 >
 > if ((RAND(100))<N) THEN RETURN RAND(X) ELSE RETURN(X+RAND(100-X));
 
 This is not a god way to get a weighted distribution (and the OP is
 NOT asking for a weighted distribution) - you should just generate one
 floating point number and apply a transformation function to it.
 Continuous transformations are quite difficult but since for a
 possible range of 100 integer values a discontinuous transformation
 would be adequate - something like:
 
 function transform($in)
 {
 if (($in<0) || ($in>100)) trigger_error('out of range');
 $mul=array(
 1=>10, 5=>9, 10=>7, 15=>6....40=>1, 50=>0.9, 55=>0.8...
 );
 return($in * $mul[5*(integer)($in/20)]);
 }
 
 Note the values above will emphasize the mean rather than what the OP
 was asking for, but could be adapted for purpose by tweaking the $mul
 values.
 
 C.
  Navigation: [Reply to this message] |