【问题标题】:Generate Random Prime number in C/C++ between 2 limits在 C/C++ 中生成 2 个限制之间的随机素数
【发布时间】:2012-11-19 20:49:27
【问题描述】:

是否有一个内置函数可以在 C/C++ 中生成介于 2 个给定限制之间的随机素数?

我想要一个可以生成100万到10亿之间随机素数的函数

【问题讨论】:

  • return 19394489;足够随机?
  • 掷骰子保证随机
  • 掷骰子?滚动时?
  • 好吧,说真的,你有什么需求?您可以在该范围内生成一个(伪)随机数并选择下一个更大或更小的素数,具体取决于您更接近哪一端。
  • 欢迎来到 C!唯一的“内置”功能非常通用。没有什么比这更具体。

标签: c++ c algorithm primes


【解决方案1】:

当我不得不这样做时,我创建了一个名为 isPrime() 的函数。 isPrime() 将检查并确定一个数字是否为素数。

isPrime() 有两个不同的函数,一个可以永远运行并打印每个素数,另一个可以运行到某个数字。

您可以使用 i 和 j 之间的所有质数填充一个数组。然后生成一个小于或等于数组大小的随机数。使用这个随机数从数组中选择一个元素。

希望这会有所帮助!

【讨论】:

  • 那些好用的uint64_t[1000000000ull]数组
  • @chris 这会很慢。我需要一个更快的解决方案。
  • 您需要对问题进行一些思考!你期待魔法。
  • Prem,我同意它会很慢。我并没有试图提供世界上最有效的解决方案。一种解决方法是在数组中预加载数据并将其存储在本地。
【解决方案2】:

您可以像这样有效地做到这一点:

  1. 在该区间内生成一个随机数;
  2. 检查它是否可以被前几个素数中的任何一个整除(比如2 .. 17,实验以获得最佳结果)。如果是,转1;
  3. 使用Miller-Rabin 测试素数。

另请参阅this 了解类似但更复杂的想法。

【讨论】:

  • 我怀疑他所说的随机是指在素数集中均匀分布。您的解决方案不会,因为随机数不是均匀分布的。不过,它可能已经足够接近了。
  • @Don Reba:只要输入的随机数均匀分布在该范围内,这种方法选择的素数也将均匀分布在该范围内的素数中。
  • 没有必要使用像 Miller-Rabin 这样的概率检验 - 10 亿小到足以让试因式分解变得可行。
  • 不要忘记,如果您选择了错误的范围,则可能在所选范围内根本没有素数。确保您的代码在尝试足够多(对于“足够”的某些值)之后没有找到任何东西时会正常退出。无限循环确实会减慢您的程序。
【解决方案3】:

要在两个边界之间生成一个随机数,请执行此操作

extern unsigned int urand();
int lower = 1000000;
int upper = 1000000000;
int p = urand() % (upper - lower) + lower;

要测试一个接近 10 亿的数是否是素数,只需对所有

unsigned short primes[3400] = { 2, 3, 5, .. 31657 }

除以它们。如果所有试除法都有余数!= 0,则该数字是素数。

我怀疑任何更复杂的素数测试对于如此小的素数会更快。

【讨论】:

  • 我将带素数的试除法与此范围内的优化素数测试进行了比较。试验划分花费了 53 倍的时间(22 微秒对 0.4 微秒)。它可能已经足够好,但在这个范围内,更快的测试有很大的好处,因为否则你需要数千个部门。
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2013-01-15
  • 2010-12-06
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
相关资源
最近更新 更多