我正在尝试在银行帐户创建示例的函数中生成 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)
请问你能帮帮我吗?
您的程序存在几个不同的问题:
最引人注目的是这一行:
cardnumber+= ( (10^i) * randd ) ;
Run Code Online (Sandbox Code Playgroud)
它不会做你认为它会做的事。该^运算符对两个操作数执行按位异或,但不计算幂。
0您用循环从数字中排除,这是不需要的(可以在没有循环的情况下完成)并且似乎也是错误的,因为0是一个完全有效的数字。如果您想强制您的号码具有 16 位数字,那么您只希望最重要的一位不同于0,而不是全部。
您的循环运行i=0to 14,因此您生成 15 位数字,而不是 16 位。
srand(time(0))每次调用此函数时都在调用。如果在同一秒内调用,这将使该函数生成相同的数字(time(0)返回当前时间戳(以秒为单位))。您可能不希望这样,并且应该srand()在您的main().
您的号码没有理由被签名,这只会导致潜在的问题,请使用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)