使用 c++11 std::uniform_int_distribution 生成随机素数

ven*_*ngy 0 c++ primes

尝试使用 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)

Jef*_*ica 5

您提供的代码:

  1. 均匀地选取范围内的随机素数。该范围内的任何给定素数与该范围内的任何其他素数出现的概率相同。
  2. 不会产生在整数范围内均匀分布的数字。例如,1-1000 范围内的数字将比 1000001-1001000 范围内的数字多得多。
  3. 效率极低(如果你要生成很多数字)

您应该明确自己想要什么。如果你想要上面的 2. 你需要一些不同的东西。