 |
|
 |
You should explain about bad seeds for this generator.
The most basic one is: if you initialise either w or z component of the generator with 0, it will be stuck on 0 (making that component of the generator useless).
But also if you initialise the w component with 0x464FFFFF, 0x8C9FFFFE, or 0xD2EFFFFD, it will get "stuck" forever on a same value output. Similarly for a value of 0x9068FFFF for the z component.
|
|
|
|
 |
|
 |
Hi, just a note to say that it seems the single parameter constructor: Public Shared Sub SetSeed(u As UInteger) is proving to result in the more "usefully random" results for me when using the GetUniform() function.
When calling the seed constructor with dual parameters, it seems the second value has only a very small affect on the variation of the result.
SetSeed(1, 1); GetUniform = 0.564106363773296;
SetSeed(2, 1); GetUniform = 0.56411055472488;
SetSeed(3, 1); GetUniform = 0.564114745676464;
SetSeed(4, 1); GetUniform = 0.564118936628048;
SetSeed(5, 1); GetUniform = 0.564123127579632;
SetSeed(1, 2); GetUniform = 0.12820853682784;
SetSeed(2, 2); GetUniform = 0.128212727779423;
SetSeed(3, 2); GetUniform = 0.128216918731007;
SetSeed(4, 2); GetUniform = 0.128221109682591;
SetSeed(5, 2); GetUniform = 0.128225300634175;
SetSeed(1, 3); GetUniform = 0.692310709416722;
SetSeed(2, 3); GetUniform = 0.692314900368305;
SetSeed(3, 3); GetUniform = 0.692319091319889;
SetSeed(4, 3); GetUniform = 0.692323282271473;
SetSeed(5, 3); GetUniform = 0.692327473223057;
I was thinking that any unique combination of parameters would result in a significantly random output. Am I misunderstanding the intention of the second param?
Thanks in advance for help
|
|
|
|
 |
|
 |
If you run these sequences further, not just generating one sample, I believe you'll see them diverge.
|
|
|
|
 |
|
 |
Hello, thanks for the article and code; my apologies, I am new to pseudo random number generators and Mathematics is a weak point of mine, but I have a question:
I would like to know up front the point the sequence repeats, I believe this is called the period, so that I can "wrap" around some dynamically generated game content.
Is this even possible to determine?
|
|
|
|
 |
|
 |
I think the period is on the order of 2^64, so you're unlikely to ever see it. If you generate 10^9 random numbers a second, you'll run out in a few centuries.
|
|
|
|
 |
|
|
 |
|
 |
The period of the w component is 2^(29.1). The period of the z component is 2^(30.2). So the period of the whole generator is actually approx 2^(59.3).
|
|
|
|
 |
|
 |
As long as it has to be. Links to resources if you wanna dig deeper and very easy to use. Excellent!
|
|
|
|
 |
|
 |
It has been extremely helpful for my project. Quite surpisingly default implementation of .Net was producing always the same result.
With the use of this alogorithm my program (used for self learning) is running perfectly fine.
Thanks & Regards,
Vikas Kapoor
Technical Specialist,
Zensar Technologies Limited,
Pune.
|
|
|
|
 |
|
|
 |
|
 |
Agin this is good stuff. This code looks like it might be very useful for something different than before. A small walkthrough on how one would create an additional distribution using this framework would be really nice though. Especially one that notes potential pitfalls. (Also though I know it is far too much to ask, it would be greatly appreciated if you could share your testing code. )
You got a 5 from me on this article some time back. Big kudos for improving an article over a course of years.
Ken
modified on Saturday, January 8, 2011 11:16 AM
|
|
|
|
 |
|
|
 |
|
 |
I think there is a bug in GetUniform method which is not caught by the tests. What happens if u = 2^32? The return statement return (u + 1) * 2.328306435454494e-10; increments u by one, making u+1 == 0, thus the method return 0, I suppose (haven't tested it, though). A simple fix would be: return (u + 1.0) * 2.328306435454494e-10; so that the increment operation is using doubles, not ints.
|
|
|
|
 |
|
 |
Yes, 1.0 would be better than 1. Thanks for reading carefully and finding that. As it stands, the code will return 0 when u = 2^32 - 1. Of course that's a rare event, but I should change the code.
Update (8 January 2011): The article and the source code have been modified to reflect this change.
modified on Saturday, January 8, 2011 10:02 AM
|
|
|
|
 |
|
 |
Excellent article, but I was wondering why all the methods are static. IMHO, this cause problems if you have a multithreaded application and you want to have more than one, yet reproducible, pseudorandom series.
Problem 1: If you have static methods and variables, you need locking or some other synchronization method. Non-static version allows RNG instance for each thread so they are safe to use without synchronization.
Problem 2: Even if you used synchronization with static methods, the pseudo random number series are not deterministic and reproducible because the RNG is used in nondeterministic times from different threads. There are several applications where you want to reproduce exactly the same pseudo random number for a given seed.
|
|
|
|
 |
|
 |
Hi John,
Excellent article though way out of my league as far as math is concerned.
The problem I am trying to solve is to generate a random positive integer y calling the GetRandom() function x number of times using VB.net. The problem I am running into is that since the computers are so fast these days, if my x is 25 (e.g), then it generates the same number 25 times.
I don't know if it makes sense to use your solution. Might be an overkill.
Do you or any of your readers have any suggestions besides using System.Threading.thread.pause(2) so I will (hopefully) have fresh seed? Or if not, any way to port your c# library into VB.NET so I can just use it directly without compiling yours into a dll?
Thanks for your help
Kuntal
|
|
|
|
 |
|
 |
You're only meant to seed the generator once, at the start. Then you can call the GetUint() function many times, and get a different value each time.
|
|
|
|
 |
|
 |
I found this to generate pretty random numbers. It's nothing fancy and I'm not sure of the statistical distribution if produces, but it works well for me.
-Denny
static double GenerateRandomNumber()
{
byte[] random_bytes = new byte[4];
new RNGCryptoServiceProvider().GetBytes(random_bytes);
int random_int = BitConverter.ToInt32(random_bytes, 0);
Random random = new Random(random_int);
return random.NextDouble();
}
|
|
|
|
 |
|
 |
While trying to figure out how to generate random number for a Poisson distribution, I came across your contribution. Thank you putting together the well written article+code+test harness. So rare these days!
BTW: I am still trying to figure out how to create Poisson RNs. Any suggestions (or code snippet) would be much appreciated. Cheers!
|
|
|
|
 |
|
|
 |
|
 |
Thank you so much. This rates a 10!
|
|
|
|
 |
|
 |
Hi John:
The GetPoisson function works nicely for me (as I have small Lamda values). But the LargePoisson function won't compile as it is looking for the LogFactorial(n) function. For the moment I've implemented the "simple/inefficient version" (just to get it to compile), but as I was intrigued by your comment "A better approach would be to use a log gamma function if one is available", I looked around your lovely clean ad-free site for the LogFactorial code but couldn't find it. My math is a tad rusty (have been out of school for four decades now!), so I don't know if I can write my own; if you could point me to the better code that would be marvelous.
Cheers!
--VVX
|
|
|
|
 |
|
 |
I have stand-alone code[^] for several functions on my web site, but not for gamma and log gamma. The stand-alone code collection is for well-documented little pieces of code you can easily copy and paste. Also, I want to write them from scratch so there are no license issues, not even open source licenses.
I haven't included gamma and log gamma because their implementations are more complicated. Some day I may add these functions.
|
|
|
|
 |
|
 |
Thanks. Look forward to seeing your gamma functions.
|
|
|
|
 |
|
|
 |