尝试使用 C++11 std::uniform_int_distribution生成[2,2147483647] 范围内的随机素数p。
有人评论说这种方法可能不正确:
这个p均匀分布在所有素数 <= 2^31 - 1 的集合上并不是立即显而易见的。无论均匀性和偏差保证随机数生成器具有什么,它们都指范围内的所有整数,但代码是“筛分”只是从中取出素数。
然而,从另一篇类似的SO文章中,它指出
只要输入的随机数在该范围内均匀分布,则该方法选择的素数也将均匀分布在该范围内的素数中。
问题
这段代码真的能正确生成随机素数吗?
https://onlinegdb.com/FMzz78LBq
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <time.h>
#include <random>
int isPrimeNumber (int num)
{
if (num == 1) return 0;
for (int i = 2; i <= sqrt (num); i++)
{
if (num % i == 0)
{
// not prime
return 0;
}
}
// prime
return 1;
}
int main ()
{
std::random_device rd;
std::mt19937 rng (rd ());
// Define prime range from 2 to 2^31 - 1.
std::uniform_int_distribution<int>uni (2, 2147483647);
int prime;
// Generate a random prime.
do { prime = uni(rng); } while (!isPrimeNumber(prime));
printf ("prime = %d", prime);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您提供的代码:
您应该明确自己想要什么。如果你想要上面的 2. 你需要一些不同的东西。