1. How to generate random 32bit integers

I have a need to generate random numbers in a range of 1 to n. N varies but may be as high as max 32 bit Uint.. 4,294,967,295.

I looks like I can do this with v 4.0 but unfortunately my app is in 3.1 and I'm not able to convert and test in the short term.

Speed is more important than distribution. It looks like the windows api may have a call for getting random numbers however there may be something better (easier/faster) coded in euphoria?

Thanks

new topic     » topic index » view message » categorize

2. Re: How to generate random 32bit integers

generate 2 16-bit random numbers and use them for upper 16, lower 16?

new topic     » goto parent     » topic index » view message » categorize

3. Re: How to generate random 32bit integers

cp said...

I have a need to generate random numbers in a range of 1 to n. N varies but may be as high as max 32 bit Uint.. 4,294,967,295.

I looks like I can do this with v 4.0 but unfortunately my app is in 3.1 and I'm not able to convert and test in the short term.

Speed is more important than distribution. It looks like the windows api may have a call for getting random numbers however there may be something better (easier/faster) coded in euphoria?

Thanks

Try ...

function rand32() 
   atom A,B 
 
   A = rand(#10000) - 1 
   B = rand(#10000) - 1 
 
   return (A * #10000 + B)  -- Returns an ATOM not an INTEGER, in the range 0 to #FFFFFFFF 
end function 
new topic     » goto parent     » topic index » view message » categorize

4. Re: How to generate random 32bit integers

DerekParnell said...
cp said...

I have a need to generate random numbers in a range of 1 to n. N varies but may be as high as max 32 bit Uint.. 4,294,967,295.

I looks like I can do this with v 4.0 but unfortunately my app is in 3.1 and I'm not able to convert and test in the short term.

Speed is more important than distribution. It looks like the windows api may have a call for getting random numbers however there may be something better (easier/faster) coded in euphoria?

Thanks

Try ...

function rand32() 
   atom A,B 
 
   A = rand(#10000) - 1 
   B = rand(#10000) - 1 
 
   return (A * #10000 + B)  -- Returns an ATOM not an INTEGER, in the range 0 to #FFFFFFFF 
end function 
cp said...

This is close. I can't allow the return to be zero so It looks like I could just remove the -1 part so that I never get a 0 result? Also since each time I do a run I have a differnt max value so I could replace #10000 with N where n = the maximum of the range?

new topic     » goto parent     » topic index » view message » categorize

5. Re: How to generate random 32bit integers

cp said...

This is close. I can't allow the return to be zero so It looks like I could just remove the -1 part so that I never get a 0 result? Also since each time I do a run I have a differnt max value so I could replace #10000 with N where n = the maximum of the range?

Ok then, try ...

function rand32(atom N) 
   integer A 
   integer B 
 
   if N <= #3FFFFFFF then 
      return rand(N) 
   end if 
 
   B = remainder(N, #10000) 
   B = rand(B) 
 
   A = floor(N / #10000) 
   A = rand(A + 1) - 1 
 
 
   return ((A * #10000) + B) -- Returns an ATOM not an INTEGER, in the range 1 to N 
end function 
new topic     » goto parent     » topic index » view message » categorize

6. Re: How to generate random 32bit integers

DerekParnell said...

Ok then, try ...

Actually, do not try that last one of mine. I just quickly wrote that during my lunch break. Now that I'm home and thought it through, it has holes. Sorry.

Anyhow, here are two different ways that you can try...

-- This first function is used locally and is not suitable for your purposes. 
function r32() 
    -- return a random number from 1 to power(2,32) 
    return ((rand(#10000) - 1) * #10000)  + rand(#10000)  
end function 
 
-- Method A: Calculate two random numbers and join them. 
global function rand_A(atom N)  
   integer A  
   integer B  
  
   if N <= #3FFFFFFF then  
      return rand(N)  
   end if  
  
   A = floor(N / #10000) 
   B = rand(A + 1) - 1 
   if B != A then 
      A = rand(#FFFF) 
   else 
      A = remainder(N,  #10000) 
      if A then 
          A = rand(A) 
      end if 
   end if 
  
   return ((B * #10000) + A) -- Returns an ATOM not an INTEGER, in the range 1 to N  
end function  
 
-- Method B: Calculate a random number such that  0 < R <= 1, then multiple that by N 
global function rand_B(atom N) 
    atom a,b,temp 
    atom A, B 
    atom UL,LL 
     
 
    if N <= #3FFFFFFF then  
        return rand(N)  
    end if  
    UL = (N - 1.5) / N 
    LL = 1.5 / N 
    a = r32() / r32() 
    b = r32() / r32() 
    if a > b then 
        temp = b 
        b = a 
        a = temp 
    end if 
    A = a / b 
    if A > UL then 
        return N 
    elsif A < LL then 
        return 1 
    end if 
    B = floor(N * A) 
     
    return B 
     
end function 
-------------------- 

The distributions are different in the two methods so your sampling might be better with one method rather than the other. You'll have to test which is more suitable.

new topic     » goto parent     » topic index » view message » categorize

7. Re: How to generate random 32bit integers

And here is another method ...

-- Method C: Generate a large (50-bit) random number and take the remainder using N. 
function rc(atom N) 
    atom a,b 
 
    if N <= #3FFFFFFF then  
        return rand(N)  
    end if  
     
    b = rand(#3FFFFFFF) 
    a = ((b - 1) * #100000) + rand(#FFFFF) 
    return remainder(a, N) + 1 
end function 
new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu