我有一个方法可以随机生成字母数字组合.如果我在循环中调用它,它将返回相同的组合,但如果我放置一个断点GetVoucherNumber并逐步执行它,则每次都会生成一个不同的数字.你能解释一下为什么会这样,以及如何避免它?
码:
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
Console.WriteLine(GetVoucherNumber(6));
Console.ReadLine();
}
public static string GetVoucherNumber(int length)
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
var result = new string(
Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)])
.ToArray());
return result;
}
Run Code Online (Sandbox Code Playgroud)
RB.*_*RB. 14
您的问题是您只创建一个Random实例.默认情况下,如果您不提供种子编号,则当前时间将用作种子.但是,您的代码执行速度如此之快,以至于同一时间被用作种子(因为您的代码执行速度比时钟的最小分辨率更快),因此您每次收到的数字都是相同的.
添加断点时,会在程序中添加延迟,以便为种子使用不同的时间.
最好的解决方法是只创建一个Random实例.random.Next然后每次调用将生成不同的数字.例如,您可以将代码更改为:
private static Random random = new Random();
public static string GetVoucherNumber(int length)
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var result = new string(
Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)])
.ToArray());
return result;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10889 次 |
| 最近记录: |