private int[] GetTarget(int[] source) { int[][] neighbor = GetNeighbor(source); int min = GetMinDistance(distance, neighbor); List <int[]> targets = new List <int[]>(); foreach (int[] n in neighbor) { if (distance[n[0], n[1]] == min) { targets.Add(n); } } SeedTag tag = GetComponent <IAutoExplore>().GetSeedTag(); int[] target = (targets.Count > 1) ? targets[random.Next(tag, 0, targets.Count)] : targets[0]; // The actor might dance around two grids of the same distance // repeatedly. We need to at least prevent PC from doing this. if (GetComponent <IAutoExplore>().IsValidDestination(target)) { return(target); } return(null); }
private void ReplenishSeedIntQueue(SeedTag seed) { if (IsRoot(seed)) { return; } // Random numbers from leaf seeds are pregenerated and stored in // seedIntQueue. Generate more numbers and a new leaf seed when the // queue is almost consumed. if (seedIntQueue.TryGetValue(seed, out Queue <int> intQueue)) { if (intQueue.Count > minQueueLength) { return; } } else { seedIntQueue.Add(seed, new Queue <int>()); } System.Random rng = new System.Random(seedInt[seed]); for (int i = 0; i < maxQueueLength; i++) { seedIntQueue[seed].Enqueue(RandomInteger(false, rng)); } seedInt[seed] = RandomInteger(false, rng); }
private int DequeInt(SeedTag tag, int min, int max) { int result; int delta = max - min; result = (int)(min + Math.Floor(delta * DequeDouble(tag))); return(result); }
public double Next(SeedTag tag) { if (IsRoot(tag)) { return(rootRNG.NextDouble()); } ReplenishSeedIntQueue(tag); return(DequeDouble(tag)); }
public int Next(SeedTag tag, int min, int max) { CheckError(min, max); if (IsRoot(tag)) { return(rootRNG.Next(min, max)); } ReplenishSeedIntQueue(tag); return(DequeInt(tag, min, max)); }
private int[][] FilterPosition(int[][] position) { SeedTag seed = GetComponent <DungeonProgressData>().GetDungeonSeed(); int[][] randomized = position.OrderBy( p => GetComponent <RandomNumber>().Next(seed)) .ToArray(); Stack <int[]> result = new Stack <int[]>(); for (int i = 0; i < maxBeetle; i++) { result.Push(randomized[i]); } return(result.ToArray()); }
private bool IsRoot(SeedTag tag) { return(tag == SeedTag.Root); }
private double DequeDouble(SeedTag tag) { double result = seedIntQueue[tag].Dequeue() / Math.Pow(10, 9); return(result); }