На днях понадобилось найти код генерации случайного простого числа. Как ни странно, в сети на этот счет полностью готового решения не нашёл. Максимум, народ выкладывал оптимизированную проверку на простоту числа.
Пришлось написать небольшой класс для генерации. Всё что делает – генерирует случайное число и сдвигает его в большую сторону до ближайшего простого. Работает, относительно, шустро, генерирует UInt32, но это не принципиально. Самой затратной операцией оказалось, как ни странно, деление с остатком. 🙂
public class PrimeNumberGenerator
{
private readonly Random _random = new Random();
public uint Generate()
{
var numberBytes = new byte[4];
_random.NextBytes(numberBytes);
uint number = BitConverter.ToUInt32(numberBytes, 0);
while (!IsPrime(number))
{
unchecked
{
number++;
}
}
return number;
}
private static bool IsPrime(uint number)
{
if ((number & 1) == 0) return (number == 2);
var limit = (uint)Math.Sqrt(number);
for (uint i = 3; i <= limit; i += 2)
{
if ((number % i) == 0) return false;
}
return true;
}
}
Использование:
var generator = new PrimeNumberGenerator(); uint prime = generator.Generate();