Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机数问题C_C#_Random_Numbers - Fatal编程技术网

C# 随机数问题C

C# 随机数问题C,c#,random,numbers,C#,Random,Numbers,我现在正在学习使用C,我只是在做一些随机的事情,所以基本上这是一个信用卡生成器,它显然不会生成真实的卡号,只是一个随机的16位数字,带有CVV和Exp日期 到目前为止,我可以让它打印Exp日期,但对于信用卡号码,我得到一个错误,它说- 无法从long转换为int,也无法转换为说明最佳重载方法的消息 我对date函数也有一些问题,我可以让它生成6个数字,例如,day和year,但是如果我再加上2个数字,它仍然会生成6个数字 这是我的代码,如果这没有意义,很抱歉,就像我说的,我是新来的: 提前感谢您

我现在正在学习使用C,我只是在做一些随机的事情,所以基本上这是一个信用卡生成器,它显然不会生成真实的卡号,只是一个随机的16位数字,带有CVV和Exp日期

到目前为止,我可以让它打印Exp日期,但对于信用卡号码,我得到一个错误,它说-

无法从long转换为int,也无法转换为说明最佳重载方法的消息

我对date函数也有一些问题,我可以让它生成6个数字,例如,day和year,但是如果我再加上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();

    }
我再说一遍,只是想说清楚,这绝不是真正的信用卡号码,它们只是随机生成的数字。…

Random.Next取int。由于499999999999999999999999和4572000000000000大于int.MaxValue 2147483647但小于long.MaxValue 9223372036854775807,它们会自动被视为表示您想要一个long,就像您在末尾加了一个L一样,但这不能被转换回一个介于-2147483648和2147483647之间的数字。如果可以的话,这对你没有多大用处

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


为了更逼真,您可以生成比您的信用卡号(通常为16)所需的数字少一个的数字,因此您将生成15个数字,尽管过去使用过从14位到19位的卡号,然后使用反向Luhn生成最终数字,这样您就有了通过Luhn检查的有效信用卡号。这甚至有实际用途,;在调试版本中,如果Luhn有效数字超出了任何实际发卡机构使用的范围,则将其作为特例是非常有用的,这样您就有了一个测试数字,大多数代码都将其视为有效数字,但最后一步是知道不要尝试购买任何东西。

正如其他人所说,问题是int不能与那么大的数字一起工作。正如你所说,你只是在玩,而不是创建真正的卡号,那么创建一个循环来创建一个数字,然后调用16次怎么样。每次调用函数时,都可以将结果附加到字符串中,并保留该值以备以后使用

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

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

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

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

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

4572000000000000对于IntThank来说太大了,我就像你说的那样,只生成了4个随机数字符串,给我16位数字,并将它们合并。我不知道如何使用Luhn,但希望有一天我能达到这样的编程水平:对于学习编码的人来说,Luhn并不是一个糟糕的练习。这是一种用于信用卡/借记卡/其他银行卡的校验和,用于在处理之前捕捉打字错误:最后一位数字可以从其余数字中计算出来,因此如果这不起作用,那么用户就有可能出错,我们可以在处理卡之前捕捉到这一点。除了具有实际用途外,它还非常简单,但比大多数只演示给定语言特性的代码要复杂一些,所以试试吧…阅读中的第一部分,看看你是否能做到。如果卡住了,请查看页面底部的Python代码,看看它是否可以作为伪代码来指导您使用C版本。然后,您可以将随机卡生成器更改为只承诺有效数字通过Luhn或只承诺无效数字不通过Luhn,因此与任何真实卡都不匹配;相当于555电话号码的信用卡。非常感谢,我实际上正在考虑使用循环,但不知道如何使用。