So working on a Random num gen and stumbled into a problem
The problem is somewhere inside " private static int FractionalPart " any ideas ?
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 ?