C++ 随机生成素数

C++ 随机生成素数,c++,C++,我试图随机生成一个素数,但它似乎不起作用,而是抛出一个正常的数字 我尝试过使用isPrime函数,并更改生成数字的位置 bool isPrime(int n){ int标志=0; 对于(int i=2;i

我试图随机生成一个素数,但它似乎不起作用,而是抛出一个正常的数字

我尝试过使用isPrime函数,并更改生成数字的位置

bool isPrime(int n){
int标志=0;
对于(int i=2;istd::cout当
n
为4时停止条件不起作用。至少需要将其更改为
n
为4时停止条件不起作用。如果(flag==0
位,位于
for
循环的
之外。另外
我请阅读更多关于它的内容和作用。想想如果在调用
rand
循环的同一个循环中,反复将相同的值传递给
srand
会发生什么。旁白:由于大多数值不是素数,这将是低效的。例如,最好生成一个随机数n,然后使用一个筛子来计算第n个素数。@500 InternalServerError:或者,如果一个数
x
下面的素数非常接近,
x/log x
,则构建一个素数表,并使用您的随机数从该表中读取值/@500 InternalServer错误对于大数来说显然不是真的(例如,您可以使用sample and reject方法生成一个随机的1024位素数,但是您不能筛选那么多),OTOH OP不处理大数,而是使用缓慢的素数测试移动
if(flag==0
位,位于
for
循环的
之外。另外
我请阅读更多关于它的内容和作用。想想如果在调用
rand
循环的同一个循环中,反复将相同的值传递给
srand
会发生什么。旁白:由于大多数值不是素数,这将是低效的。例如,最好生成一个随机数n,然后使用一个筛子来计算第n个素数。@500 InternalServerError:或者,如果一个数
x
下面的素数非常接近,
x/log x
,则构建一个素数表,并使用您的随机数从该表中读取值/@500 InternalServer对于大的数字,这显然不是正确的错误(例如,您可以使用sample-and-reject方法生成一个随机的1024位素数,但是您不能筛选那么多)Otoh OP不处理大量的数字,使用慢的素数测试连续调用函数将导致相同的数目,或者SRAND应该在程序或函数中更早地调用,应该采取种子参数,但不是这样的。UnLUT:这取决于用例。新C++标准中有更强的生成器。t good old
rand()
真的没那么糟糕。@Bathsheba:不管使用“公钥”这个词意味着
rand()
输出太小(而且加密不安全)无论如何,这不是真的。绝大多数实现都非常非常糟糕,因为它们是简单的LCG实现,没有太多的注意。如果你幸运的话,你有MT作为生成器(例如,在我的系统上没有)这不是很可悲的,但也不是很适合PK。连续调用函数会导致相同的数目,或者SRAND应该被调用在程序或函数前面的某个地方,应该采取种子参数,但不是这样。@ UNLUT:这取决于用例。在新的C++标准中有更强的生成器,但是好的老的。
rand()
真的没那么糟糕。@Bathsheba:忽略使用“公钥”这一事实表明
rand()
输出太小(而且不安全)无论如何,这不是真的。绝大多数实现都非常非常糟糕,因为它们是简单的LCG实现,没有太多的注意。如果你幸运的话,你有MT作为生成器(尽管,例如,我的系统上没有),这不是很可怜,但也不太适合PK。
for (int i = 2; i <= n / 2; ++i)
for (int i = 2; i <= n / i; ++i)
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;
}
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;
}
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();
}
srand(time(NULL));
do {
    p = rand();
} while (!isPrime(p));