Tag Archives: csharp

Raspberry PI and Random values

I’m developing a simple rpg game, testing it with .NET on Win and Mono on Win/Mac/Linux works perfectly. Today I decided to test it on my Arch Raspberry PI to see if it could run well on this device and the result is that the game won’t even start for some “Array out of index” exception that does not appear with other systems.
After some time debugging here and there, I found out that the Random.Next function does not behave correctly on RPi.
Running this test code:
Random r = new Random();
for (int i = 0; i<10; i++) { Console.WriteLine(r.Next(0,7)); }

on the RPi prints ten times the number seven!
This is wrong for two reasons: First obliviously it's not returning random numbers and secondly it is returning the maxValue, which should be "exclusive" and it may never be returned by the function.
So calling something like
array[random.Next(0,array.Length)]
should return a value between 0 and array.Length-1, but it returns array.Length causing my out of index exception.

I tried testing Random.Next(), Random.Next(int) and Random.NextDouble() and they all behave correctly. I dunno if this is a bug in Mono:ARM or something related to the Raspberry PI.

UPDATE: Further investigations lead me to think that the problem was actually Math.Round(double), which is called in Random.Next. I'm not sure I understood it completely but looks like it is a well know problem: Mono:ARM does not support PI's hard float OSs, causing errors while working with floating point numbers. There's a patch for that and even an official RPi Debian distro with soft float support, which I won't bother installing right now. Next time PI, next time.

UPDATE: 3 April
Found an hard float version of Mono here on official Pi forums. I tested it on a clean upgraded dist-upgraded Raspbian "wheezy" from 2013 Feb 09 image and it works, remember to expand the root filesystem through raspi-config or to uninstall unneeded packages as wheezy's root partition is 2gb only and is filled with junk stuff (at least junk for me, as I use my RPI via command line SSH). On my Arch setup for some reason it was not working, but an user reported in that thread that it works on his Arch, so I think was my fault, probably some file from my previous mono test that wasn't deleted or overwritten.

Working on a map generator

MapGenIn the last two weeks I’ve beeen working on a pseudo random map generator for my next game. After discarding a big pack of work, I think I’m finally going the right direction.
The program takes a random, or user defined, seed and from there it start making a map. The map will never exceeds its borders, making it optimal for indoor map generation. From the same seed it will always create the same map, Billions maps will take the same amount of space on hard disk as two or three. This will allow player to replay the maps they like or share them with other players just by sharing sharing the map seed. In a multiplayer experience (which my game will not probably be, but who knows?) it will allow everyone on the same server to play with exactly the same nearly-infinte maps without having to send huge amounts of data over the net.

It’s still basic and I need to add some other stuff like multi-floor generation and odd building shapes. This is lots of work to do, but hey, everything has to start somewhere!
Meanwhile you can play around with it here.