随机数问题C#

时间:2015-07-30 21:41:43

标签: c# random numbers

我现在正在学习使用C#,而我只是想到了随机的东西,所以基本上这是一个“信用卡生成器”,它显然不会生成真正的卡号,只是一个随机的16位数字,与CVV和Exp日期。

到目前为止,我可以打印出Exp日期,但至于信用卡号,我收到的错误是 -

“无法从long转换为int”,也是一条说明最佳重载方法的消息。

我也遇到了日期功能的一些问题,我可以让它生成6个数字,例如,日期和年份,但如果我尝试添加另外2个数字,它仍会吐出6个。

这是我的代码,抱歉,如果这没有意义,就像我说的,我是新手:)

提前感谢您的帮助。

private void button1_Click(object sender, EventArgs e)
    {


        Random rnd = new Random();
        double cardNumber = rnd.Next(4572000000000000, 4999999999999999);
        int cvv = rnd.Next(001, 999);
        int expDay = rnd.Next(1, 30);
        int expMonth = rnd.Next(1, 12);
        int expYear = rnd.Next(2011, 2015);

        textBox1.Text = cardNumber.ToString();
        textBox2.Text = cvv.ToString();
        textBox3.Text = expDay.ToString() + expMonth.ToString() + expYear.ToString();

    }

我会再次说明这一点,为了明确这一点,这绝不会产生真正的信用卡号码,它们只是随机生成的数字......

3 个答案:

答案 0 :(得分:2)

Random.Next需要int。由于49999999999999994572000000000000大于int.MaxValue2147483647)但小于long.MaxValue9223372036854775807),因此会自动将其视为您需要的一个long(就好像你最后放了一个L),但是不能将其转回-2147483648和{{1}之间的数字}。如果可能的话,这对你没用多大。

您可以生成一系列较短的数字并将它们组合在一起。

为了获得更大的逼真度,您可以生成比您的信用卡号码少一个号码(通常为16,因此您生成15个号码,但使用了14位到19位的卡号码)在过去)然后做一个反向Luhn来产生最终的数字,所以你有一个通过Luhn检查的有效信用卡号。 (这甚至具有实际用途;在调试版本中,任何真实卡发行商使用的范围之外的Luhn有效数字特殊情况可能很有用,这样您就可以获得大部分测试编号。代码视为有效数字,但最后一步知道不要尝试购买任何东西。

答案 1 :(得分:0)

正如其他人所说的那样,问题在于int并不适用于那些大的数字。正如你所说,你只是玩游戏而不是创建真实的卡号,那么创建一个循环来创建一个数字,然后调用16次。每次调用该函数时,都可以将结果附加到字符串中并保存该值以供日后使用。

此外,我认为还没有人指出,但你使用double作为卡号的类型。这是一种不精确的数据类型,在这里你需要一个精确的数字是不合适的。你想要的值可能是1234567891234567,但实际存储在内存中的是123456789123456.0000000000001。

Random rnd = new Random();
string cardNumber = string.Empty;

for(int i = 0; i < 16; i++)
{
    cardNumber += rnd.Next(0,9).ToString();
}

答案 2 :(得分:0)

这是我现在使用的代码,但我想看看上面建议的循环,它似乎是一个更清晰的解决方案。

        Random rnd = new Random();
        int cardNumber1 = rnd.Next(4572, 4999);
        int cardNumber2 = rnd.Next(1000, 9999);
        int cardNumber3 = rnd.Next(1000, 9999);
        int cardNumber4 = rnd.Next(1000, 9999);
        int cvv = rnd.Next(100, 999);
        int expDay = rnd.Next(1, 30);
        int expMonth = rnd.Next(1, 12);
        int expYear = rnd.Next(2015, 2019);

        textBox1.Text = cardNumber1.ToString() + cardNumber2.ToString() + cardNumber3.ToString() + cardNumber4.ToString();
        textBox2.Text = cvv.ToString();
        textBox3.Text = expDay.ToString() + "/" + expMonth.ToString() + "/" + expYear.ToString();