#### Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

# Random without math.random

edited October 2015 Posts: 11

Hi.
In my last posted discussion i used my own random function (because i don't want to initiate standard function from math lib), so today i want to describe it.
My function uses os.time() as seed.
My function code:

``````initial global a > 0

function calla()
a = math.fmod(math.sqrt(os.time()), a+2)
while a>1 do
a = math.fmod(math.sqrt(os.time()), a+1)
end
return a
end
``````

In next images i uses white dots to represent density of possibility, white lines as n*0.2 marks(where n=1 to 5), blue dots to represent integral average value, and multi-color rectengles to represet count of random values(results of call calla, or math.random()) that are fill current interval of partition(i divided segment from 0 to 1 in 500 intervals to do this images).
Standard function(math.random() with math.randomseed(os.time())):
http://s14.postimg.org/pa0tg7a7l/image.jpg
My function:
http://s14.postimg.org/667hzuxdd/image.jpg
As you can see thay look almost the same, and have grate random properties (one higher because i take screensots in not exact same time when code was runing).
So you are free to use it in your projects).
And finally code that generate this images:

``````function setup()
displayMode(FULLSCREEN)
s = image(WIDTH, HEIGHT)
a = 10 --use any value biger than 0
sm = 0
t = {}
count = 500
for i = 1, count do
table.insert(t, 0)
end
print(calla(), #t)
steps = count
am =0
k = 0
rm = 0
math.randomseed(os.time())
end

function draw()
w = WIDTH/#t
for i =1, 1000 do
k = math.floor(calla()*steps)
if k<=#t and k>0 then
t[k] = t[k] + 1
end
rm = rm + 1
end
setContext(s)
fill(0,25)
rect(0,0,WIDTH,HEIGHT)
stroke(255)
strokeWidth(2)
for i = 1, math.floor(#t/100) do
line(100*i*w, 0, 100*i*w, HEIGHT)
end
strokeWidth(0)
local cm,tm = 0,0
for k,v in pairs(t) do
if v>0 then
fill(255*(1-k/#t)^(1/3), 255*(k/#t)^(1/3), 0)
rect(w*(k-1)+1,0,w, v)
end
cm = cm + v
fill(255)
ellipse(w*(k-1)+w/2, HEIGHT*cm/rm, w+1)
fill(0,0,196)
tm = tm + v
if k>1 and k<#t then
ellipse(w*(k-1)+w/2, tm/k, w+1)
end
end
if am <#t-1 then
am = am + 1
else
am = 1
end
setContext()
sprite(s, WIDTH/2, HEIGHT/2)
end

function calla()
a = math.fmod(math.sqrt(os.time()), a+2)
while a>1 do
a = math.fmod(math.sqrt(os.time()), a+1)
end
return a
end
``````
Tagged:

• Posts: 5,396

Why wouldn't you use math.random? Surely there are far more interesting things to do in Codea than rewrite built in functions? • Posts: 182

I've always wondered how psuedo-random numbers are generated though, can you explain the idea behind the code?

Also as Ignatz asked why don't you want to use the built in function?

• Posts: 5,396

It is extremely difficult to generate a good RNG, just looking random is nowhere near enough - google "test random number generator" to see the kind of tests required.

It's like cryptography - homemade versions almost always have flaws, so it's much, much, much, much better to stay with fully tested algorithms.