using System.Collections.Generic;
public static void Main()
for (int i = 0; i < 16; i++) {
var samples = GetSampleDataIndexes(i);
Console.WriteLine($"i = {i,4}: [" + string.Join(", ", samples) + "]" + $"\t(count: {samples.Count})");
var samples2 = GetSampleDataIndexes(499);
Console.WriteLine($"i = 499: [" + string.Join(", ", GetSampleDataIndexes(499)) + "]" + $"\t(count: {samples2.Count})");
samples2 = GetSampleDataIndexes(1099);
Console.WriteLine($"i = 1099: [" + string.Join(", ", GetSampleDataIndexes(1099)) + "]" + $"\t(count: {samples2.Count})");
samples2 = GetSampleDataIndexes(1100);
Console.WriteLine($"i = 1100: [" + string.Join(", ", GetSampleDataIndexes(1100)) + "]" + $"\t(count: {samples2.Count})");
private const int ReferenceFraction = 100;
private const int MaxSampleSize = 20;
private const int MinSampleSize = 10;
public static List<long> GetSampleDataIndexes(long length) {
if (length <= MinSampleSize) {
return Enumerable.Range(0, (int)length).Select(Convert.ToInt64).ToList();
var sampleLength = Math.Clamp(length / ReferenceFraction, MinSampleSize, MaxSampleSize);
var uniqueValues = new HashSet<long>();
while (uniqueValues.Count < sampleLength) {
uniqueValues.Add(GetRandomLong(length));
private static long GetRandomLong(long maxValue) {
var random = new Random();
return (long)(random.NextDouble() * maxValue);