Я поиграл и написал "Среда тестирования" для этого алгоритма Rand (7). Например, если вы хотите попробовать, какое распределение дает ваш алгоритм или сколько итераций требуется для генерации всех различных случайных значений (для Rand (7) 1-7), вы можете использовать его .
Мой основной алгоритм такой:
return (Rand5() + Rand5()) % 7 + 1;
Ну не менее равномерно, чем у Адама Розенфилда. ( который я включил в мой код фрагмента )
private static int Rand7WithRand5()
{
//PUT YOU FAVOURITE ALGORITHM HERE//
//1. Stackoverflow winner
int i;
do
{
i = 5 * (Rand5() - 1) + Rand5(); // i is now uniformly random between 1 and 25
} while (i > 21);
// i is now uniformly random between 1 and 21
return i % 7 + 1;
//My 2 cents
//return (Rand5() + Rand5()) % 7 + 1;
}
Эта «среда тестирования» может принимать любой алгоритм Rand (n), тестировать и оценивать его (распределение и скорость). Просто вставьте свой код в метод Rand7WithRand5 и запустите фрагмент.
Несколько замечаний:
- Алгоритм Адама Розенфилда не лучше, чем, например, мой. В любом случае, распределение обоих алгоритмов ужасно.
- Собственный Rand7 (
random.Next(1, 8)
) завершен, поскольку он сгенерировал все члены в заданном интервале примерно за 200 итераций, алгоритмы Rand7WithRand5 принимают порядок 10k (около 30-70k)
- Реальная задача не состоит в том, чтобы написать метод для генерации Rand (7) из Rand (5), но он генерирует значения, более или менее равномерно распределенные.