Одно легкодоступное семя для ГСЧ - это любая функция времени. Начальное число не обязательно должно быть случайным, если оно каждый раз меняется при каждом запуске программы, этого достаточно. Попытка сделать псевдослучайное число «более случайным» - это несколько глупая попытка. Если это необходимо, то генератор не стоит его соли.
Кроме того, если вы не будете регулярно сеять с истинным случайным шумом, вы все равно не сделаете вывод «более случайным», и если вы регулярно будете отбирать истинный случайный шум, только семена будут действительно случайными, остальные значения все еще детерминированы и в целом имеют те же статистические свойства, что и любая другая последовательность, сгенерированная этим генератором.
Обычная реализация для получения чисел в диапазоне не степени двух, если перекошенное распределение неприемлемо, выглядит примерно так:
range = high - low;
while((r = rand()) > range) {}
r += low;
Модули и умножение / деление имеют хорошо известные проблемы с перекосом и переполнением.
Хотя, как вы сказали, если это решение AI, я осмелюсь сказать, что никто не заметит, если один результат на 1% более вероятен, чем другой. Поэтому простое использование по модулю, вероятно, достаточно хорошо, имеет детерминированное время и очень просто. Также обратите внимание, что вы всегда можете выбрать диапазон, который хорошо работает по модулю.