随机生成质数
Randomly generate prime number
本文关键字:随机 更新时间:2023-10-16
我正在尝试随机生成一个质数,但它似乎不起作用,而只是抛出一个正常数字。
我尝试过使用 isPrime 函数,并更改生成数字的位置
bool isPrime(int n) {
int flag = 0;
for (int i = 2; i < n / 2; ++i) {
if (n % i == 0) {
flag = 1;
break;
}
if (flag == 0) return true;
else return false;
}
}
void generatePublicKey() {
int p = 0;
int q = 0;
while (!isPrime(p)) {
srand(time(NULL));
p = rand();
}
std::cout << p;
}
当n
为 4 时,停止条件不起作用。至少需要将其更改为<=
.
for (int i = 2; i <= n / 2; ++i)
更好的是,我认为您正在寻找的限制不是&一半;n,而是√n。我们应该循环只要i <= sqrt(n)
,或者等价地:
for (int i = 2; i <= n / i; ++i)
flag
检查应在循环之外。当它在循环内时,它会触发第一次迭代,从而阻止循环完成。
bool isPrime(int n) {
int flag = 0;
for (int i = 2; i <= n / i; ++i) {
if (n % i == 0) {
flag = 1;
break;
}
}
if (flag == 0) return true;
else return false;
}
任何时候你写if (condition) return true; else return false;
它都可以简化为较短但等效的return condition;
。
bool isPrime(int n) {
int flag = 0;
for (int i = 2; i <= n / i; ++i) {
if (n % i == 0) {
flag = 1;
break;
}
}
return flag == 0;
}
你甚至可以摆脱旗帜,如果你只是在找到除数后立即返回false
。
bool isPrime(int n) {
for (int i = 2; i <= n / i; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
}
while (!isPrime(p)) {
srand(time(NULL));
p = rand();
}
您只想为随机数生成器设定一次种子。每次迭代重新播种 PRNG 会让你一遍又一遍地获得相同的数字。将srand()
调用移出循环。
将其更改为 do-while 循环也是明智的。您要确保在调用isPrime
之前生成一个随机数。
srand(time(NULL));
do {
p = rand();
} while (!isPrime(p));
注意:最好还是将srand()
调用完全移出generatePublicKey()
。理想情况下,它应该在main()
开始时调用一次。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- GCC:随机构建导致执行期间分段错误
- 如何使用 SML 随机生成八进制元组
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 将正态随机变量与任意 RHO(corrcoef) 相关联