如何使用 C 语言中的 rand() 函数生成 16 位随机数?

Fre*_*ext 1 c random

我正在尝试在银行帐户创建示例的函数中生成 16 位随机卡号。我尝试了下面的代码,但它不起作用。

void generate_card_number() {
    srand(time(0));
    long long int cardnumber = 0;
    int i, randctrl;

    for (i = 0; i < 15; i++) {
        do {
            randctrl = rand() % 9;
        } while (randctrl == 0);
        cardnumber += ((10^i) * randctrl);
    }
    printf("\nThe Card Number : %lld", cardnumber);
}
Run Code Online (Sandbox Code Playgroud)

请问你能帮帮我吗?

Mar*_*lli 5

您的程序存在几个不同的问题:

  1. 最引人注目的是这一行:

    cardnumber+= ( (10^i) * randd ) ;
    
    Run Code Online (Sandbox Code Playgroud)

    它不会做你认为它会做的事。该^运算符对两个操作数执行按位异或,但不计算幂。

  2. 0您用循环从数字中排除,这是不需要的(可以在没有循环的情况下完成)并且似乎也是错误的,因为0是一个完全有效的数字。如果您想强制您的号码具有 16 位数字,那么您只希望最重要的一位不同于0,而不是全部

  3. 您的循环运行i=0to 14,因此您生成 15 位数字,而不是 16 位。

  4. srand(time(0))每次调用此函数时都在调用。如果在同一秒内调用,这将使该函数生成相同的数字(time(0)返回当前时间戳(以秒为单位))。您可能不希望这样,并且应该srand()main().

  5. 您的号码没有理由被签名,这只会导致潜在的问题,请使用unsigned.

这是一个相当简单的代码版本,可以实现您想要的效果。如果您正在寻找更快/更优化的版本,您可能需要查看chqrlie 的其他答案

void generate_card_number()
{
    unsigned long long cardnumber;
    unsigned i;

    // Ensure most significant digit is not 0
    cardnumber = rand() % 9 + 1;

    // Add 15 more digits (which can also be 0)
    for (i = 0; i < 15; i++)
    {
        cardnumber *= 10;
        cardnumber += rand() % 10;
    }

    printf("\nThe Card Number : %llu", cardnumber);
}
Run Code Online (Sandbox Code Playgroud)