|  | Posted by Jerry Stuckle on 02/01/08 02:39 
Fred wrote:> On 31 jan, 14: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));
 >
 > Thanks for the info, i wont mind on him then =)
 >
 > Almost there with the code,
 >
 > Let me add some real number in the exemple :
 >
 > i know before the random what number i must have over let take 50 for
 > the exemple,
 > i also need the random to still pick between 0 and 100, but with a
 > chance of 60% (exemple) to draw something over 50 .
 >
 > Thanks
 >
 
 Actually, the troll "Natural Philosopher" is one one who should be
 ignored.  He seldom has anything to say that is correct.  I was just
 pointing out you really aren't looking for a random number, from your
 description.  Maybe a minor point to you, but very important when
 creating an algorithm.
 
 The real question here is, what kind of distribution do you want?  For
 example, do you want a linear distribution, an exponential or
 logarithmic distribution, or like you said here, a 60% chance of being
 over 50?
 
 In the case you cited, you want 1-50 to occur 40% of the time, and
 51-100 to occur 60% of the time (approximately).  Something like this
 might work (not tested but the algorithm should work):
 
 function notReallyRand() (
 $temp = mt_rand(0,999);
 if ($temp < 400)
 return intval($temp/8);
 else
 return intval((($temp-400) / 12) + 50);
 }
 
 It gets a random number between 0 and 999.  If the random number is
 between 0 and 399 (inclusive), it returns value / 8 as an int (0-49).
 
 If the value is >= 400, it subtracts 400 from the value (0-599) and
 divides by 12 (0-49.xx).  It add 50 to this and returns the int value
 (50-99).
 
 You can adjust values as necessary.
 
 
 
 
 --
 ==================
 Remove the "x" from my email address
 Jerry Stuckle
 JDS Computer Training Corp.
 jstucklex@attglobal.net
 ==================
  Navigation: [Reply to this message] |