随机生成质数

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()开始时调用一次。