public DataType SelectRandomItem(RandomSearchQuality quality) { if (values.First == null) { return(default(DataType)); // no elements } if (quality == RandomSearchQuality.Fast) { LinkedListNode <DataType> first = values.First; if (first.Value.Equals(lastSelected)) { LinkedListNode <double> firstKey = keys.First; values.RemoveFirst(); keys.RemoveFirst(); values.AddLast(first); keys.AddLast(firstKey); first = values.First; } lastSelected = first.Value; return(first.Value); } else { LinkedListNode <DataType> node = values.First; for (int chosen = randgen.Next(values.Count); chosen > 0; chosen--) { node = node.Next; } return(node.Value); } }
public DataType SelectSalientItem(RandomSearchQuality quality) { if (quality == RandomSearchQuality.Fast) { return(SelectSmartItem()); } else { return(SelectExactItem()); } }
public DataType SelectSalientItem(RandomSearchQuality quality) { if (values.First == null) { return(default(DataType)); // no elements } if (quality == RandomSearchQuality.Fast) { LinkedListNode <DataType> first = values.First; if (first.Value.Equals(lastSelected)) { // move it to the end LinkedListNode <double> firstKey = keys.First; values.RemoveFirst(); keys.RemoveFirst(); values.AddLast(first); keys.AddLast(firstKey); first = values.First; } lastSelected = first.Value; return(first.Value); } else { double target = randgen.NextDouble() * salienceSum; double sofar = 0; LinkedListNode <double> nodekey = keys.First; LinkedListNode <DataType> nodevalue = values.First; while (nodekey != null && nodevalue != null) { sofar += nodekey.Value; if (sofar >= target) { return(nodevalue.Value); } nodekey = nodekey.Next; nodevalue = nodevalue.Next; } // Salience calculation failure! Console.WriteLine("WARNING: Salience miscalculation! Max is " + sofar.ToString() + " not " + salienceSum.ToString()); salienceSum = sofar; // Try again! return(SelectSalientItem(quality)); } }
public DataType SelectRandomItem(RandomSearchQuality quality) { if (quality == RandomSearchQuality.Fast) { double position; return(SelectWeightedItem(.5, out position).Data); } else { int chosen = randgen.Next(Count); RedBlackEnumerator <double, DataType> enumerator = GetNodeEnumerator(); while (enumerator.HasMoreElements()) { RedBlackNode <double, DataType> node = enumerator.NextElement(); if (chosen-- == 0) { return(node.Data); } } return(default(DataType)); } }