|
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
==================
[Back to original message]
|