internal virtual Value NewUniqueValue(RandomValues random, ISet <Value> uniqueCompareValues, IList <Value> uniqueValues) { int attempts = 0; int maxAttempts = 10; // To avoid infinite loop on booleans Value value; do { attempts++; ValueType type = RandomValues.among(Types); bool useExtremeValue = attempts == 1 && RandomValues.NextDouble() < FRACTION_EXTREME_VALUE; if (useExtremeValue) { value = RandomValues.among(type.extremeValues()); } else { value = random.NextValueOfType(type); } } while (attempts < maxAttempts && !uniqueCompareValues.Add(value)); uniqueValues.Add(value); return(value); }