【发布时间】:2025-11-21 08:55:02
【问题描述】:
我想生成 25 个唯一的随机数并在控制台中列出它们。数字应至少有 10 个字符长。有什么简单的方法吗?
【问题讨论】:
-
按字符我猜你是指十进制数字?
-
是的,它们也可以是字母数字字符。请不要使用 guid
-
字母数字!= 随机数。你想要随机字符串
我想生成 25 个唯一的随机数并在控制台中列出它们。数字应至少有 10 个字符长。有什么简单的方法吗?
【问题讨论】:
尝试将数字构建为字符串,并使用 HashSet 确保它们是唯一的:
Random random = new Random();
HashSet<string> ids = new HashSet<string>();
while (ids.Count < 25)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; ++i)
{
sb.Append(random.Next(10));
}
ids.Add(sb.ToString());
}
示例输出:
7895499338 2643703497 0126762624 8623017810 ...ETC...HashSet 类存在于 .NET 3.5 及更高版本中。
【讨论】:
问题在于“25 unique random”。显示 25 个随机数很简单
Random r = new Random();
for(int i=0; i<25; i++)
Console.WriteLine(r.Next(1,100).ToString());
不过,这些不一定是唯一的。如果您不想允许重复,则需要以某种方式存储以前生成的数字,如果遇到旧数字,请再次滚动。
请注意,您可以通过这种方式更改生成数字的概率分布。
编辑:我刚刚注意到这些数字应该是十个字符长。由于 9,999,999,999 超过了 Int32.MaxValue,我建议使用 Math.Floor(r.NextDouble() * 10000000000 + 1000000000) 而不是 r.Next(1,100)。
由于您的号码很长,因此您不必担心重复。他们非常不可能。
【讨论】:
999 999 999 不超过int.MaxValue。但是,将 r.Next() 乘以十亿可能。
r.Next() 返回一个 double 而不是 int,这就是我使用它的原因。
r.Next() 返回一个 int。你想要r.NextDouble(),即使那样你也把事情复杂化了。
随机性和唯一性之间有很大的不同。
因此,如果您确实需要唯一号码,则必须确保将所有已创建的号码保存在某个位置,并检查您新创建的号码是否不在此列表中,或者您必须提供一些算法这样可以确保给定的数字不会被创建两次。
要使第二部分正常工作,您主要采用创建时刻的日期/时间,因为当前日期/时间对永远是唯一的。唯一的问题是您每(毫秒)秒有多少创造,以及有多少位可用于存储您的唯一编号。
关于使用 12 位数字 is made here 的示例。希望这会有所帮助。
【讨论】:
一个简单的方法是这样的:
class Test
{
private static void Main()
{
Random rand = new Random();
for (int i = 0; i < 25; ++i)
{
Console.WriteLine(rand.Next(1000000000, int.MaxValue));
}
}
}
这将确保数字始终为 10 个字符(数字)长。然而,它们不一定是唯一的。如果您希望它们绝对是独一无二的,则必须执行以下操作:
class Test
{
private static void Main()
{
Random rand = new Random();
var generatedSoFar = new HashSet<int>();
for (int i = 0; i < 25; ++i)
{
int newRand;
do
{
newRand = rand.Next(1000000000, int.MaxValue);
} while (generatedSoFar.Contains(newRand)); // generate a new random number until we get to one we haven't generated before
generatedSoFar.Add(newRand);
Console.WriteLine(newRand);
}
}
}
如果您希望能够有 10 位以上的数字,您可以在 10 和最大位数之间随机生成位数。然后在StringBuilder 或List 中随机生成每个数字(或数字组)。您可以使用我上面使用的相同HashSet 方法来确保唯一性。
【讨论】:
Random rnd = new Random(table);
for(int i = 0; i < 25; ++i) {
Console.WriteLine("{0}", rnd.Next(50, 50+i)
}
【讨论】: