 |
|
 |
Thus the code line returning the result in the GetUnitform method has to be changed to
return (u + 1) * 2.328306435454494e-010;
Note: the number slightly differs from the "old" number because (2^32 + 1) is just a little bit smaller than (2^32 + 2) -> the 2^32 part dominates.
|
|
|
|
 |
|
 |
I've revised the code and the article. The new version was posted 6 Oct 2008.
modified on Monday, October 6, 2008 3:23 PM
|
|
|
|
 |
|
 |
Hello Mr. Cook.
I like your article !
Do you have any knowledge on designing RNG algorithms ?
I mean all the math theory etc...
If you do I would like to see some theory, in this or in another article.
Perhaps this site isn't the best place to write articles for math but I think some programmers interested in math may find this usefull.
Thanks.
kostas KEL
|
|
|
|
 |
|
 |
For an introduction to the mathematical theory, you might want to start with volume 2 of Donald Knuth's Art of Computer Programming, Seminumerical Algorithms. Also, you may be interested in another CodeProject article I wrote, "[^]Pitfalls in Random Number Generation
|
|
|
|
 |
|
 |
Thanks !
kostas KEL
|
|
|
|
 |
|
|
 |
|
 |
Good observation. This has been corrected as of 6 October 2008.
|
|
|
|
 |
|
 |
you can just do this :
Random ran = new Random();
double d = ran.NextDouble();
and u will get a double between 0 and 1 then u can do what ever u want with it so why spnd time trying to create one ?
|
|
|
|
 |
|
 |
For the fun maybe? Beside that, it's probably better to turn to System.Security.Cryptography for production code.
|
|
|
|
 |
|
 |
just showed how easy it is to get a random number
|
|
|
|
 |
|
 |
One reason for a custom generator is transparency. If you're trying to reproduce a problem and stepping through the code with a debugger, everything is right there in your code under your control.
Sometimes it's helpful to compare results of code written in different environments. If they all use their own library's RNG, the results aren't comparable. But, for example, you could use this code from unmanaged C++ and from C# and produce identical sequences if you start from identical seeds.
modified on Friday, April 11, 2008 10:08 PM
|
|
|
|
 |
|
 |
If you want 1 random number fine but if you need hundreds or thousand that will be truly random then it's a problem. I am trying to write a statistics app and I can't seem to get random numbers.
|
|
|
|
 |
|
 |
For one reason, the bug that was recently discovered in the random number generator used by Vista and everything that came before.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
 |
|
 |
Random in c# is SUCK!
if my program run 100 in 1 millisec. the random value would just the same.
|
|
|
|
 |
|
 |
I'll stick with what's built-in.
This is one of many areas where I know Microsoft can do better than I can.
|
|
|
|
 |
|
 |
PIEBALDconsult wrote: This is one of many areas where I know Microsoft can do better than I can
This may be true, but others can do significantly better. You probably don't need really random numbers, but if you do, the in-built functions like rand() are not up to the task.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
 |
|
 |
I use System.Security.Cryptography.RNGCryptoServiceProvider
|
|
|
|
 |
|
 |
That's fine for crypto work, but what about for statistical simulations (Monte Carlo etc), here you need very fast random number generation with good statistical properties. The inbuilt Random() function looks similar to rand() from c. I haven't made any serious use of random numbers in .NET, but it is possible that this simple generator could be useful.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
 |
|
 |
This PRNG is only usable for monte carlo simulations. And i think it is better than rand() for this purpose, because it passes the DIEHARD tests, the build in rand() function don't!
Where are the problems in crypthography?
1. It is only 32Bit wide - no problem for a brute force attack, at least you need 128Bit, 160Bit or 256Bit is better.
2. It is guessable. If you have a number, you can guess the previous number because the algorithm has not the strength of an cryptography hash function like SHA or even MD5. If the output must be salted and hashed to masquerade, it looses it statistical distribution because of the hash function. In this case you can use a salted hash function to produce a PRN sequence like this:
salt = something real random
number = 0; // Dosn't matter because of the salt!
number = CryptoHash( number xor salt )
number = CryptoHash( number xor salt )
(replace CryptoHash with your prefered hash function like SHA)
Due to the fact that cryptographical hash functions are slow and often don't produce a perfect statistical distribution, it is not very good to use them for monte carlo simulations.
|
|
|
|
 |
|
 |
I neither speak nor understand statistics or math all that well, but I am absolutely sure that there is no way to generate true random numbers using a computer, so one algorithm is just as good as the other and all that Monte Carlo and DIEHARD talk is just salt in the eyes.
I can always invent my own algorithm and then invent a test that it will pass. In fact it's quite easy, but I will always know that the numbers it will generate will never be absolutely random, so what's the point of all this theory?
|
|
|
|
 |
|
 |
You are right: no computer algorithm will produce 'truly' random numbers.
So the goal is to create a sequence of numbers that appears to be random for whatever purpose we want to use it for.
In cryptography, random means unpredictable. Given some numbers from the sequence, it is impossible to guess the next number.
In simulations, random means that the sequence is not unusual. The DIEHARD tests[^] basically run a large number of simulations and call out very improbable results.
|
|
|
|
 |
|
 |
I never liked statistics, and words like "set" give me the chillies. There are computed numbers and there are random numbers. In computer technology, they are all computed (that's why it's called a computer). That's all I need to know. But thanks for answering after so long... Good to know someone doesn't think I'm just posting flamebait, because I'm not. I just like to challenge the "great minds". And to understand statistics does take a great mind. Cheers!
|
|
|
|
 |
|
 |
There are dozens of RNG's around. Each RNG is suitable for some situations but not in others. The two big classes are simulations and cryptography, and they are nearly mutually exclusive.
Crypto RNG's have a specific purpose: to show randomness that is not predictable from previous values. For example, given enough data points, it is possible to predict the next number in a Mersenne Twister sequence. So, even though its randomness is great, its predictibility makes it a no-no for cryptography applications.
Conversely, crypto RNG's tend to be slow, and may show some correlations that would be unacceptable in a simulation.
The built-in .NET RNG is decent, and will do for most people's uses. It is based on Knuth's 3rd RNG algorithm from The Art of Computer Programming, Vol.2. But for serious simulations, it is not adequate.
|
|
|
|
 |
|
 |
I think there are 2 reasons for building your own RNG:
1. As the author said :"The statistical (and not only) quality of the built-in generator might not be adequate for some tasks.". I.e.: cyptography. If someone knows the starting point (seed) of your RNG can figure out all the sequence, no matter how long that may be ! But if the algorithm is not a "common" or "well known" algorithm, then he has no chance finding anything!
2. That way you can balance, yourself, statistical quality and complexity (time delay) the way you want.
However, most apps don't need all this effort. And as you say MS usually does things work great!
But don't underestimate this article !
Of course, I always prefer creating random numbers using natural, non-mathematical processes (some people even use radioactive sources to build RNG! - Yes that is a crazy world, isn't it?) but there is always an easier way!
kostas KEL
modified on Monday, August 25, 2008 11:48 AM
|
|
|
|
 |
|
 |
KEL3 wrote: But if the algorithm is not a "common" or "well known" algorithm
Security through obscurity?
KEL3 wrote: can figure out all the sequence
Yes, but you shouldn't use all the sequence. I always skip a few on each call so "they" would also need to know when each call was made.
|
|
|
|
 |