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

如何使用C中的rand()函数生成16位随机数?,c,random,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 (

我试图在函数中为银行帐户生成一个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);
}

您能帮助我吗?

您的代码中有几个问题:

srandtime0;用于为伪随机数生成器设定种子。在主函数中只使用一次,否则在同一秒内生成的所有数字都将相同。 要生成一个16位的随机数,唯一不能为零的数字是第一个数字,其他所有数字都可以,这与代码所做的不同。 10^i不计算C中10的i次方,它计算10个异或i。 您没有计算足够的数字。 Rand没有定义。 计算从最高有效到最低有效的数字更容易。以下是修改后的版本:

#include <stdlib.h>

void generate_card_number() {
    // start with a digit between 1 and 9
    long long cardnumber = 1 + rand() % 9;
    // add the remaining 15 digits
    for (int i = 1; i < 16; i++)
        cardnumber = cardnumber * 10 + rand() % 10;
    printf("The Card Number: %lld\n", cardnumber);
}
在大多数平台上,RAND_MAX要大得多,因此这里有一个替代方案可以利用这一点,并使用较少的调用生成号码:

#include <stdlib.h>

void generate_card_number() {
#if RAND_MAX >= 100000000
    // start with a number between 10000000 and 99999999
    long long cardnumber = 10000000 + rand() % 90000000;
    cardnumber = cardnumber * 100000000 + rand() % 100000000; // add 8 digits
#else
    // start with a number between 1000 and 9999
    long long cardnumber = 1000 + rand() % 9000;
    cardnumber = cardnumber * 10000 + rand() % 10000; // add 4 digits
    cardnumber = cardnumber * 10000 + rand() % 10000; // add 4 digits
    cardnumber = cardnumber * 10000 + rand() % 10000; // add the last 4 digits
#endif
    printf("The Card Number: %lld\n", cardnumber);
}

但是请注意,卡号有额外的限制,例如限制值范围,并且必须具有有效的Luhn校验和。

您的代码中有几个问题:

srandtime0;用于为伪随机数生成器设定种子。在主函数中只使用一次,否则在同一秒内生成的所有数字都将相同。 要生成一个16位的随机数,唯一不能为零的数字是第一个数字,其他所有数字都可以,这与代码所做的不同。 10^i不计算C中10的i次方,它计算10个异或i。 您没有计算足够的数字。 Rand没有定义。 计算从最高有效到最低有效的数字更容易。以下是修改后的版本:

#include <stdlib.h>

void generate_card_number() {
    // start with a digit between 1 and 9
    long long cardnumber = 1 + rand() % 9;
    // add the remaining 15 digits
    for (int i = 1; i < 16; i++)
        cardnumber = cardnumber * 10 + rand() % 10;
    printf("The Card Number: %lld\n", cardnumber);
}
在大多数平台上,RAND_MAX要大得多,因此这里有一个替代方案可以利用这一点,并使用较少的调用生成号码:

#include <stdlib.h>

void generate_card_number() {
#if RAND_MAX >= 100000000
    // start with a number between 10000000 and 99999999
    long long cardnumber = 10000000 + rand() % 90000000;
    cardnumber = cardnumber * 100000000 + rand() % 100000000; // add 8 digits
#else
    // start with a number between 1000 and 9999
    long long cardnumber = 1000 + rand() % 9000;
    cardnumber = cardnumber * 10000 + rand() % 10000; // add 4 digits
    cardnumber = cardnumber * 10000 + rand() % 10000; // add 4 digits
    cardnumber = cardnumber * 10000 + rand() % 10000; // add the last 4 digits
#endif
    printf("The Card Number: %lld\n", cardnumber);
}

但是请注意,卡号有额外的限制,例如限制值范围,并且必须具有有效的Luhn校验和。

您的程序有几个不同的问题:

最值得注意的是这一行:

cardnumber+= ( (10^i) * randd ) ;
这和你想象的不一样。^运算符执行两个操作数的位异或运算,但不计算幂

使用循环将0从数字中排除,这是不必要的,没有循环也可以做到,而且似乎是错误的,因为0是一个完全有效的数字。如果要强制数字为16位,则只希望最重要的数字与0不同,而不是所有数字

您的循环在i=0到14之间运行,因此生成的是15位,而不是16位

每次调用此函数时,您都在调用srandtime0。如果在相同的秒时间内调用,这将使函数生成相同的数字。0以秒为单位返回当前时间戳。您可能不想这样做,应该在main中只调用srand一次

没有理由对您的数字进行签名,这只会导致潜在问题,请使用unsigned

下面是一个相当简单的代码版本,它可以实现您想要的。如果您正在寻找一个更快/更优化的版本,您可能希望签出


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

最值得注意的是这一行:

cardnumber+= ( (10^i) * randd ) ;
这和你想象的不一样。^运算符执行两个操作数的位异或运算,但不计算幂

使用循环将0从数字中排除,这是不必要的,没有循环也可以做到,而且似乎是错误的,因为0是一个完全有效的数字。如果要强制数字为16位,则只希望最重要的数字与0不同,而不是所有数字

您的循环在i=0到14之间运行,因此生成的是15位,而不是16位

每次调用此函数时,您都在调用srandtime0。如果在相同的秒时间内调用,这将使函数生成相同的数字。0以秒为单位返回当前时间戳。您可能不想这样做,应该在main中只调用srand一次

没有理由对您的数字进行签名,这只会导致潜在问题,请使用unsigned

下面是一个相当简单的代码版本,它可以实现您想要的。如果您正在寻找一个更快/更优化的版本,您可能希望签出


正如评论中指出的,如果您不必对卡号进行任何算术运算,如加法、减法等。最好将卡号存储为字符串:

整型随机数字{ 返回兰特%10; } 无效generateCardNumberchar cardNumber[],整数大小{ 对于int i=0;i
0216624478324435
8815844216687237

正如评论中指出的,如果您不必对卡号进行任何算术运算,如加法、减法等。最好将卡号存储为字符串:

整型随机数字{ 返回兰特%10; } 无效generateCardNumberchar cardNumber[],整数大小{ 对于int i=0;i
0216624478324435
8815844216687237

你打算对这个数字做算术运算吗?如果不尝试生成16个字符的字符串保留空间来终止“\0”,我建议为此使用16个字符的长字符串。。。其中每个字符都是“0”到“9”,如果加1除以3没有意义,请检查它是否为素数。。。它不应该是数字。rand%9给出的数字范围为0。。8.如果您不想要任何0,您可以添加1而不是循环。您是否计划对该数字进行算术运算?如果不尝试生成16个字符的字符串保留空间来终止“\0”,我建议为此使用16个字符的长字符串。。。其中每个字符都是“0”到“9”,如果加1除以3没有意义,请检查它是否为素数。。。它不应该是数字。rand%9给出的数字范围为0。。8.如果您不想要任何0,您可以添加1而不是循环。char card1[SIZE+1],card2[SIZE+1]并写入空终止符。除此之外,我还将使用字符串,绝对不是整数,并且不使用硬编码值,所有这些值都是从卡号长度派生的。非常感谢您的评论。我已经根据您的评论更新了我的答案。card1[SIZE+1],card2[SIZE+1]并写入空终止符。除此之外,我还将使用字符串,绝对不是整数,并且不使用硬编码值,所有这些值都是从卡号长度派生的。非常感谢您的评论。我已经根据你的评论更新了我的答案