Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Random Num Gen broken

$
0
0
So working on a Random num gen and stumbled into a problem

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Random_gen
{
    class Program
    {
        private const int Count = 500;

        static void Main(string[] args)
        {
            var standardRand = new Random(20);

            var min = 1.0;
            var max = 0.0;
            var valueCounter = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            var list = new Dictionary<double, int>();
            var duplicates = 0;
            var iterations = 0;

            var timeStart = DateTime.Now;

            // Do stuff
            for (int x = -Count; x < Count; x++)
                for (int y = -Count; y < Count; y++)
                {
                    //var rand = standardRand.NextDouble();
                    //var rand = MyRandom.Hash1D(x * y);
                    var rand = MyRandom.Hash2D(20, x * 0.1f, y * 0.1f);

                    if (!list.ContainsKey(rand))
                        list.Add(rand, 1);
                    else
                    {
                        list[rand]++;
                        duplicates++;
                    }

                    iterations++;
                }

            var timeStop = DateTime.Now;
            var elapsedTime = TimeSpan.FromTicks((timeStop - timeStart).Ticks);

            #region Analytics

            var sum = 0.0;
            foreach (var kvp in list)
            {
                var rand = kvp.Key;

                if (rand < min)
                    min = rand;

                if (rand > max)
                    max = rand;

                if (rand >= 0.0 && rand < 0.1)
                    valueCounter[0]++;
                else if (rand >= 0.1 && rand < 0.2)
                    valueCounter[1]++;
                else if (rand >= 0.2 && rand < 0.3)
                    valueCounter[2]++;
                else if (rand >= 0.3 && rand < 0.4)
                    valueCounter[3]++;
                else if (rand >= 0.4 && rand < 0.5)
                    valueCounter[4]++;
                else if (rand >= 0.5 && rand < 0.6)
                    valueCounter[5]++;
                else if (rand >= 0.6 && rand < 0.7)
                    valueCounter[6]++;
                else if (rand >= 0.7 && rand < 0.8)
                    valueCounter[7]++;
                else if (rand >= 0.8 && rand < 0.9)
                    valueCounter[8]++;
                else if (rand >= 0.9 && rand <= 1.0)
                    valueCounter[9]++;

                sum += rand * list[rand];

            }

            Console.WriteLine("{0:###,###,###} Iterations took: {1:D2}min:{2:D2}sec:{3:D2}msec",
                                iterations, elapsedTime.Minutes, elapsedTime.Seconds, elapsedTime.Milliseconds);

            Console.WriteLine("     {0}\n   {1}", min, max);

            Console.WriteLine("\nDistribution: ");
            Console.WriteLine("     0.0 to 0.1 = {0:###,###,###}", valueCounter[0]);
            Console.WriteLine("     0.1 to 0.2 = {0:###,###,###}", valueCounter[1]);
            Console.WriteLine("     0.2 to 0.3 = {0:###,###,###}", valueCounter[2]);
            Console.WriteLine("     0.3 to 0.4 = {0:###,###,###}", valueCounter[3]);
            Console.WriteLine("     0.4 to 0.5 = {0:###,###,###}", valueCounter[4]);
            Console.WriteLine("     0.5 to 0.6 = {0:###,###,###}", valueCounter[5]);
            Console.WriteLine("     0.6 to 0.7 = {0:###,###,###}", valueCounter[6]);
            Console.WriteLine("     0.7 to 0.8 = {0:###,###,###}", valueCounter[7]);
            Console.WriteLine("     0.8 to 0.9 = {0:###,###,###}", valueCounter[8]);
            Console.WriteLine("     0.9 to 1.0 = {0:###,###,###}", valueCounter[9]);

            var avg = sum / (double)iterations;

            Console.WriteLine("\nStatistics:");
            Console.WriteLine("     Mean = {0}", avg);
            Console.WriteLine("     Duplicates = {0}", duplicates);

            #endregion

            Console.ReadKey();
        }
    }

    public class MyRandom
    {
        public static double Hash1D(int seed)
        {
            seed = (seed << 13) ^ seed;
            var output = (((seed * ( seed * seed * 15731 + 789221) + 1376312589) & 0xffffffff) / (double)int.MaxValue) / 2.0;

            return output;
        }

        public static double Hash2D(int seed, float x, float y)
        {
            var ux = (int)x + FractionalPart(x);
            var uy = (int)y + FractionalPart(y);
            seed = seed + ux * 73 + uy * 179;

            seed = (seed << 13) ^ seed;
            var output = (((seed * (seed * seed * 15731 + 789221) + 1376312589) & 0xffffffff) / (double)int.MaxValue) / 2.0;

            return output;
        }

        private static int FractionalPart(double n)
        {
            var s = n.ToString("F9");
            s = s.Substring(s.IndexOf(".") + 1);
            if (s == string.Empty)
                s = "0";

            return int.Parse(s);
        }
    }
}




The problem is somewhere inside " private static int FractionalPart " any ideas ?

Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>