Random numbers: Difference between revisions

From Legacy Roblox Wiki
Jump to navigationJump to search
>Sduke524
No edit summary
>NXTBoy
Lots of misconceptions here. Timing and arguments to math.random are irrelevant
Line 3: Line 3:
There is a random number generator in Roblox that seems to generate random numbers.  
There is a random number generator in Roblox that seems to generate random numbers.  
But do a test, and insert this script into your place:<br/>
But do a test, and insert this script into your place:<br/>
<pre>
 
for i = 1, 10 do
for i = 1, 10 do
print(math.random(1,100))
    print(math.random(100))
wait(1)
    wait(1)
end
end
</pre>


Test the place, and look at the [[Scripting|output window]]. Write down the numbers you get, and exit the test. Then do the test again, and again write down the numbers you get. Notice something weird? Those 10 very random numbers are similar everytime you run a test (or play online for that matter).
Test the place, and look at the [[Scripting|output window]]. Write down the numbers you get, and exit the test. Then do the test again, and again write down the numbers you get. Notice something weird? Those 10 very random numbers are similar everytime you run a test (or play online for that matter).
Line 16: Line 15:
== The General idea ==
== The General idea ==


Everytime a script in a place does math.random(), the random generator generates a random number. If this is done at exactly the same time, with exactly the same random numbers everytime, then the random number sequence will be the same every time (like the test at the top of this page).<br/>
Everytime a script in a place does math.random(), the random generator generates a random number. However, the random number generator is deterministic. It uses the last random number to generate the next random number. When the scripts starts, the "first" random number is always the same. So every time the script is run, the same random number sequence will be generated, as in the test at the top of this page.
However, if you were able to make the place generate random numbers at random times (in addition to your normal random generations), then the sequence of random numbers would change, right? Yes! <br/>
The problem is, if the randomly generated randomizing of the random number generator is the same everytime it randomizes something, then the sequence will still be the same every time!


== How to generate TRULY random numbers ==
== How to generate TRULY random numbers ==
Line 27: Line 24:
* Other real-life influences on the game
* Other real-life influences on the game


There are 3 things this can influence that in general will make stuff very random:
There are 2 ways you can increase the randomness of the random number generator:
'''math.random(x,y)'''
* call math.random() a random (from real-life influences) number of times
* If you change either x or y (random numbers min and max)
* Seed the random generator with a truly random number
* If you change when the math.random happens
* If you change how often the math.random happens


If you can find a way to make something truly random influence any of the three listed items, then you will be able to generate truly random numbers!
If you can find a way to make something truly random influence any of the two listed items, then you will be able to generate truly random numbers!


===math.randomseed()===
===math.randomseed()===
The best way to fix this problem is a function called math.randomseed(). What the function does is set a seed for the random number generator.
The best way to fix this problem is a function called math.randomseed(). What the function does is set a seed for the random number generator.


The problem is finding a good seed. Fortunately, Roblox made the function [[Function_Dump/Roblox_Specific_Functions#tick.28.29|tick()]]. What that does is print the amount of seconds that elapsed since UNIX time (1/1/1970 0:00:00).
The problem is finding a good seed. One option is to s=use [[Function_Dump/Roblox_Specific_Functions#tick.28.29|tick()]]. This returns the number of seconds elapsed since UNIX time (1/1/1970 0:00:00).
 
To use it, simply pass the result of tick() to math.randomseed() parenthesis.


To integrate it, simply put tick() inside the math.randomseed() parenthesis. Something like this:
math.randomseed(tick())


<pre>
math.randomseed(tick())
</pre>


===Using the Seed===
===Using the Seed===
You could put math.randomseed() anywhere. It is recommended to put it at the beginning of the script (it doesn't really matter, as long as if you put it before you use math.randomseed()). Now, let's use the experiment script that we used before and use math.randomseed with it!
You could put math.randomseed() anywhere. It is recommended to put it at the beginning of the script (it doesn't really matter, as long as if you put it before you use math.randomseed()). Now, let's use the experiment script that we used before and use math.randomseed with it!


<pre>
math.randomseed(tick())
math.randomseed(tick())


for i = 1, 10 do
for i = 1, 10 do
print(math.random(1,100))
      print(math.random(1,100))
wait(1)
      wait(1)
end
end
</pre>


Congratulations! Your random numbers will now be much more random than before!
Congratulations! Your random numbers will now be much more random than before!
<!--=== Example 1 ===
Have a script in workspace that checks for number of players in the game every 10 seconds or so, then does a math.random() code based on the number of players.<br/><br/>
<pre>
while true do
players = game.Players:getChildren()
wait(10)
if #players > 0 then
math.random(1, #players)
end
</pre>
"#players" means "number of players". We don't need to remember the random number we generate. It is enough to just generate a number to make the random number generator randomized. Also note, that if the number of players in a place is the same at all the same times every time, then the random numbers will be the same every time too.
=== Example 2 ===
''You don't really need to do anything more than in Example 1, but these extra examples are included for the more interested people.''<br/>
This script is even more randomized, and even randomizes the time between each randomization:
<pre>
while true do
players = game.Players:getChildren()
wait(math.random(1,#players))
if #players > 0 then
math.random(1, #players)
end
</pre>
Also here, note, that if the number of players in a place is the same at all the same times every time, then the random numbers will be the same every time too.
=== Example 3 ===
''You don't really need to do anything more than in Example 1, but these extra examples are included for the more interested people.''<br/>
Alternatively, you could randomize numbers based on players movement by putting this touch-script into a brick that players walk across now and then (maybe a baseplate?)
<pre>
local debounce = 0
function onTouch(hit)
if debounce == 0 then
debounce = 1
if hit.Parent:findFirstChild("Humanoid") ~= nil then
math.random(1,100)
end
debounce = 0
end
end
script.Parent.Touched:connect(onTouch)
</pre>
Everytime someone steps on this brick, the random-number generator will be randomized.-->


== Even more random ==
== Even more random ==
When doing something like math.random(1,100) all the numbers will turn out as whole numbers and in some cases, just isn't enough. However, if you were to do  
When doing something like math.random(1, 100) all the numbers will turn out as whole numbers, which in some cases, just isn't enough. However, if you were to do  
<pre>
math.randomseed(tick())


for i = 1, 10 do
math.randomseed(tick())
print(math.random()*100+1)
wait(1)
for i = 1, 10 do
end
    print(math.random()*100)
</pre>
    wait(1)
end


The numbers will be completely random and between 1 and 100.
The numbers will be random non-integers between 1 and 100.


[[Category:Scripting Tutorials]]
[[Category:Scripting Tutorials]]

Revision as of 08:39, 17 July 2011

Introduction

There is a random number generator in Roblox that seems to generate random numbers. But do a test, and insert this script into your place:

for i = 1, 10 do
    print(math.random(100))
    wait(1)
end

Test the place, and look at the output window. Write down the numbers you get, and exit the test. Then do the test again, and again write down the numbers you get. Notice something weird? Those 10 very random numbers are similar everytime you run a test (or play online for that matter).

This article explains how to achieve truly random numbers that are NEVER the same for every time a place is played

The General idea

Everytime a script in a place does math.random(), the random generator generates a random number. However, the random number generator is deterministic. It uses the last random number to generate the next random number. When the scripts starts, the "first" random number is always the same. So every time the script is run, the same random number sequence will be generated, as in the test at the top of this page.

How to generate TRULY random numbers

You need to make a script do math.random(x,y) at at least one TRULY random time, and then the rest of the randomized numbers will be truly random. Scripting is, of course, needed to make this happen. Some truly random events can be things like:

  • Number of players in your place
  • Players movement
  • Other real-life influences on the game

There are 2 ways you can increase the randomness of the random number generator:

  • call math.random() a random (from real-life influences) number of times
  • Seed the random generator with a truly random number

If you can find a way to make something truly random influence any of the two listed items, then you will be able to generate truly random numbers!

math.randomseed()

The best way to fix this problem is a function called math.randomseed(). What the function does is set a seed for the random number generator.

The problem is finding a good seed. One option is to s=use tick(). This returns the number of seconds elapsed since UNIX time (1/1/1970 0:00:00).

To use it, simply pass the result of tick() to math.randomseed() parenthesis.

math.randomseed(tick())


Using the Seed

You could put math.randomseed() anywhere. It is recommended to put it at the beginning of the script (it doesn't really matter, as long as if you put it before you use math.randomseed()). Now, let's use the experiment script that we used before and use math.randomseed with it!

math.randomseed(tick())

for i = 1, 10 do
     print(math.random(1,100))
     wait(1)
end

Congratulations! Your random numbers will now be much more random than before!

Even more random

When doing something like math.random(1, 100) all the numbers will turn out as whole numbers, which in some cases, just isn't enough. However, if you were to do

math.randomseed(tick())

for i = 1, 10 do
    print(math.random()*100)
    wait(1)
end

The numbers will be random non-integers between 1 and 100.