Letting a probability of an object to appear in the scene...

Started by
4 comments, last by Waterlimon 10 years, 10 months ago

If on each frame update, I pick a randomized number, if this number is greater than 100000, then I let the object appear, is it an efficient or good way?

Thanks

Jack

Advertisement

Probably not... how high can the maximum number go!?

You are better off picking a random number between 0 and 1 (usually not including 1 with many API's) and using a percentage chance instead.

e.g. 20% to appear = rand(0 to 1) < 0.2

If your random number generator only gives you (positive) ints find out what the maximum is and divide the result by max-1 (make sure you don't use integer division though) - that will generate a number between 0 and 1 (not including 1).

"Most people think, great God will come from the sky, take away everything, and make everybody feel high" - Bob Marley

that for sure will not work because the probability from the random object is less than 1% which is a super low drop rate assuming

if your number was used in my approach stated below.

What you can do is achieve a 50% drop rate. This is written in Java:

Random random = new Random();

if(random.nextInt(2) == 1)

{

// add your item to the screen

}

nextInt method returns an integer number between 0(inclusive) and 2(exclusive)

So it basically returns either 0 or a 1 which is 50% or (1/(total possibilties))

Not the most efficient way, but it would work. In SFML, you could do something like this: Create a timer, get a random number using rand() between x and n, and set the timer to go off after the random number of seconds is up. After the timer goes off, you would execute whatever you wanted to happen.

Here is a link to the SFML Timer page so you can learn more about it: http://www.sfml-dev.org/documentation/2.0/classsf_1_1Time.php.

If you're not using SFML, I'm sure you could easily apply it to another API.

Typically you would use float [0..1) for probability.

However, let me point something else out to you:

If on each frame update, I pick a randomized number...

I'm stressing on that particular sentence. This is a poor way to do any probability. Regardless of how low the probability is, counting it on each frame update means it will happen very often! If you say 1% chance of event X happening, and your game runs at 100fps, guess what happens? In one second, event X will occur.

That's not what you want, right? Rather than counting it every frame, pick a more deterministic occurence of when you are going to count the probability. Something like on a button press or on every second.

He could apply the frame delta time to the random.

for a random between 0 and 1

if (rand(0-1) < 0.5*dt)

{

something...

}

would give you 50% chance regardless of FPS (i hope) of the object to appear during 1 second. Unless the FPS is less than 1. And the behaviour might still depend a bit on FPS.

But the timer method is probably the best way to go, as you can throw in some limits (like, always add 10 seconds to the spawn time in addition to the random delay, so no object will appear at a rate faster than once in 10 secs)

o3o

This topic is closed to new replies.

Advertisement