【问题标题】:Random Number Issue C#随机数问题 C#
【发布时间】:2015-07-30 21:41:42
【问题描述】:

我现在正在学习使用 C#,只是在做我想到的随机东西,所以基本上这是一个“信用卡生成器”,它显然不会生成真实的卡号,只是一个随机的 16 位数字,带有 CVV 和 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();

    }

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

【问题讨论】:

  • 4572000000000000 对于 int 来说太大了

标签: c# random numbers


【解决方案1】:

Random.Next 接受int。由于49999999999999994572000000000000 大于int.MaxValue (2147483647) 但小于long.MaxValue (9223372036854775807),因此它们会自动被视为表明您想要long(就好像您将L 结束),但不能转回 -21474836482147483647 之间的数字。如果可以的话,那对你也没有多大用处。

您可以生成一系列较短的数字并将它们相加。

为了更逼真,您可以比您的信用卡号少一个数字(通常是 16,因此您会产生 15 个数字,尽管在过去),然后执行反向 Luhn 以生成最终号码,因此您将拥有一个通过 Luhn 检查的有效信用卡号。 (这甚至有实际用途;在调试版本中将 Luhn-valid 数字特殊情况下任何真实发卡机构使用的范围之外的特殊情况下很有用,这样您就有了一个大多数代码都会处理的测试数字作为一个有效的数字,但最后一步知道不要尝试购买任何东西)。

【讨论】:

  • 非常感谢,我按照你说的做了,只是生成了 4 个随机数字符串给我 16 位数字并加入它们。我不知道如何与 Luhn 打交道,但希望有一天我能达到那种编程水平 :)
  • Luhn 对于学习编码的人来说是一个不错的练习。它是用于信用卡/借记卡/其他银行卡的校验和,用于在处理之前捕获拼写错误:最后一位数字可以从其余数字中计算出来,因此如果这不起作用,则可能是用户犯了错误,我们可以在之前发现我们尝试处理卡片。除了具有实际用途外,它非常简单,但比大多数仅演示给定语言功能的代码要复杂一些,所以试试吧! …
  • 阅读en.wikipedia.org/wiki/Luhn_algorithm中的第一个位,看看你能不能做到。如果卡住了,请查看该页面底部的 Python 代码,看看它是否可以作为伪代码来指导您使用 C# 版本。然后,您可以将随机卡生成器更改为仅承诺有效数字(通过 Luhn)或仅承诺无效数字(不要通过 Luhn,因此与任何真实卡不匹配;相当于 555 电话号码的信用卡) .
【解决方案2】:

正如其他人所说,问题在于 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();
}

【讨论】:

  • 非常感谢,我实际上正在考虑使用循环,但无法弄清楚如何。
【解决方案3】:

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

        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();

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2012-04-13
    • 2011-05-21
    • 2012-09-16
    • 2017-04-10
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多