How random is random?
Moderators: winston, another_commander, Getafix
How random is random?
I've been testing my RH shipset oxp and been printing into the log the names of the ships that get spawned. And for some reason there is one name that keeps on popping: "Grandmaster Nemoricus". RandomHits name is created by selecting first name and second name from arrays in descriptions.plist.
To my calculations the probabilities should be as follows:
Probability for Grandmaster is 1/3 * 2/5 * 1/47 that approximates to 0.0028
Probability for Nemoricus is 1/3 * 1/4 * 1/55 that approximates to 0.0015
Oolite is 1.77.1. Any idea?
To my calculations the probabilities should be as follows:
Probability for Grandmaster is 1/3 * 2/5 * 1/47 that approximates to 0.0028
Probability for Nemoricus is 1/3 * 1/4 * 1/55 that approximates to 0.0015
Oolite is 1.77.1. Any idea?
- Commander McLane
- ---- E L I T E ----
- Posts: 9520
- Joined: Thu Dec 14, 2006 9:08 am
- Location: a Hacker Outpost in a moderately remote area
- Contact:
Re: How random is random?
The answer is: not very. The mechanism that selects entries from descriptions.plist is based on a sequence created from the seed. This means that at every game start the same sequence is generated and used, thus you always get the same names. Certain events reset the sequence, starting from its first value again, which is why you see a certain variance as time passes, because when one of those events occurs is not predictable.How random is random?
In addition to that, the sequence only consists of two-digit numbers (I believe). Thus any key in descriptions.plist that contains more than 100 entries is wasted. No more than 100 of its entries can ever be randomly selected.
These are natural limitations of using descriptions.plist and extracting values from it by the bracket method. The only real way to overcome them and solve the problem of repeating random numbers is to convert descriptions.plist to an JS-array and extract the entries via
Math.random()
in JS.Re: How random is random?
Ok, that explains a lot. Thanks for the explanation. Any idea if this will change in the future? I'm pondering about the conversion job and if it's worth the trouble. With RandomHits the conversion to js is not going to be very straightforward as descriptions include bracketed references which again include bracketed references... and so on.
- Commander McLane
- ---- E L I T E ----
- Posts: 9520
- Joined: Thu Dec 14, 2006 9:08 am
- Location: a Hacker Outpost in a moderately remote area
- Contact:
Re: How random is random?
I think not. It's part of the legacy scripting engine, and thus it's sort of obsolete anyway. Changing it would also break compatibility with 1.65, and therefore stability.spara wrote:Ok, that explains a lot. Thanks for the explanation. Any idea if this will change in the future?
Converting the descriptions.plist to JS arrays is a tedious job, indeed. I'm currently in the process of doing it for the comms messages of personalities, and I can only do so much copying and pasting each session before my brain melts. And it's going to be much worse for RH, because of the sheer size of it. But it'll definitely be worthwhile. Apart from getting rid of the random generator limitations, I believe that decriptions.plist is also a rather time consuming way of extracting random strings.
In randomshipnames I'm using independent functions for each level of recursion. Each function can (randomly) either insert a random string or call another function that will in turn either insert a random string or call another function, etc. That's how I would design it for RH as well.spara wrote:With RandomHits the conversion to js is not going to be very straightforward as descriptions include bracketed references which again include bracketed references... and so on.
Re: How random is random?
I haven't checked what RH needs, but maybe CCL_PhraseGen can help -> https://app.box.com/s/m7zgdpe7tg0492w9ikxi
Edit: After taking a look at RH I can only say - keep the plists.
Edit: After taking a look at RH I can only say - keep the plists.
Re: How random is random?
Svengali wrote:After taking a look at RH I can only say - keep the plists.
Quite a lot of work there alright. If I ever touch it, I'll be doing more than just converting it. I would very much like to change the naming of ships to RandomShipNames engine so that RandomHits better integrates to the game. Currently used pilot names would only appear in contract offerings. We'll see. If I'm bored at some point, I might take a longer look at it.
- Eric Walch
- Slightly Grand Rear Admiral
- Posts: 5536
- Joined: Sat Jun 16, 2007 3:48 pm
- Location: Netherlands
Re: How random is random?
With Oolite 1.75 and older, it was even worse. Some events did reset the random seed, resulting in (almost) always getting the same results. In Random Hits main script, you therefor find the lines:
I used that in the part that created the hit-pages. I think it was touching the systemname, did reset the seed.
And the fact that expanding from the plist is biassed towards certain results, is also the reason I used the Js Math.random() function to select the ship for the mark. That one I wanted really random.
Code: Select all
if (0 < oolite.compareVersion("1.76")) // bad randomness is not fixed in 1.75 so we still need the next two lines.
{
count = Math.round(Math.random()*10);
for (var k=0; k<count; k++) name = expandDescription("[nom2]"); // mix up the random generator
}
And the fact that expanding from the plist is biassed towards certain results, is also the reason I used the Js Math.random() function to select the ship for the mark. That one I wanted really random.
UPS-Courier & DeepSpacePirates & others at the box and some older versions
Re: How random is random?
Thanks Eric. I had noticed those lines earlier, but they did not make sense then. Now I see the meaning of those.
One more question. Is Oolite's own randomName function random enough to be used to replace the name lists used in RandomHits?
One more question. Is Oolite's own randomName function random enough to be used to replace the name lists used in RandomHits?
Re: How random is random?
So ... okay:
1)
2) Without testing I would guess that
3) There are two separate random number generators used in Oolite. The
Seed resets are no longer a problem, however - seed values can be saved and loaded: if a particular seeded sequence is needed, the old state of the generator is saved, the seeded sequence is generated, and the old state is restored so the main chain of random numbers remains sensible.
There is a second random number generator in Oolite - the Ranrot algorithm - which is extremely high quality (certainly better than the random number generator used by the JS
1)
descriptions.plist
is not itself obsolete or part of legacy scripting. It's by far the easiest way for us to include translatable strings in the core game. Randomisation using it is also not obsolete - it just needs improvement.2) Without testing I would guess that
descriptions.plist
was at worst no slower than using JS arrays, just because JS is an intrinsically slower language than the Objective-C parser for descriptions. In terms of memory usage descriptions.plist
is considerably better than a JS array since the memory usage is in the general pool rather than in the much smaller JS pool.3) There are two separate random number generators used in Oolite. The
descriptions.plist
one is Elite-compatible to ensure that planet descriptions stay as in previous versions. It is limited to two digits - hex digits, not decimal, so 256 is the absolute limit, and anything above about 16 entries will have seriously skewed probabilities - but importantly it also has serious correlation problems between successive values, so while any individual number has an even probability, once you know the first number the following numbers are much more constrained.Seed resets are no longer a problem, however - seed values can be saved and loaded: if a particular seeded sequence is needed, the old state of the generator is saved, the seeded sequence is generated, and the old state is restored so the main chain of random numbers remains sensible.
There is a second random number generator in Oolite - the Ranrot algorithm - which is extremely high quality (certainly better than the random number generator used by the JS
Math.random()
function). It would probably make sense to use this instead of the Elite-compatible one except in contexts where Elite-compatible behaviour (basically only planetary info) was required. I'll add that to 1.79It basically just expands %N, which is not great. I'd stick with the name lists you already have, though sometimes taking a name from the existing list and sometimes expandingspara wrote:Is Oolite's own randomName function random enough to be used to replace the name lists used in RandomHits?
"%N [nom]"
would give you more variety.