C# 如何从C中的两个数组中获取两个随机字符串#

C# 如何从C中的两个数组中获取两个随机字符串#,c#,arrays,string,random,C#,Arrays,String,Random,如何从两个数组中随机获取两个字符串。我有些东西,但不是随便挑的 string[] firstNames = { "John", "Michael", "Victor", "Mark", "Alex", "Steven", "Zack", "Howard", "Xzavier", "Brendan",

如何从两个数组中随机获取两个字符串。我有些东西,但不是随便挑的

string[] firstNames = { "John", "Michael", "Victor", "Mark", "Alex", "Steven", "Zack", "Howard", "Xzavier", "Brendan", "Dustin", "Carl" };
string[] lastNames = { "Adams", "McGregor", "Piasta", "Semmel", "Laris", "Sever", "Bourque", "Percy", "Shanabarger", "Bobak", "Adair" };
string[] shuffled = firstNames.OrderBy(n => Guid.NewGuid()).ToArray();
string[] shuffled2 = firstNames.OrderBy(n => Guid.NewGuid()).ToArray();
Random firstn = new Random();
Random lastn = new Random();
int index = firstn.Next(firstNames.Length);
int index2 = lastn.Next(lastNames.Length);
Console.WriteLine($"The random name is {firstNames[index]}" + $" {lastNames[index2]}");

我正在尝试创建一个随机的全名生成器。我已多次尝试此代码,结果是:约翰·亚当斯、维克多·皮亚斯塔等等正如您所见,它们不是随机的。

随机在.NET Framework和.NET Core中的工作原理略有不同

在.NET Framework中,默认种子值与时间相关。在.NETCore中,默认种子值由线程静态伪随机数生成器生成

发件人:

仅在.NET Framework中,在大多数Windows系统上,在15毫秒内创建的随机对象可能具有相同的种子值


在.NET Framework上使用单个随机实例来避免这种行为。

在我看来非常随机

通过150次迭代,您仍然可以获得132种可能组合中大约90种的性能

测试代码:

HashSet<string> names = new HashSet<string>(150);

Random rndm = new Random();

for (int i = 0; i < 150; i++)
{
    names.Add($"{firstNames[rndm.Next(firstNames.Length)]} " +
              $"{lastNames[rndm.Next(lastNames.Length)]}");
}

Console.WriteLine($"{names.Count} / {firstNames.Length * lastNames.Length}");
Console.ReadKey();
HashSet name=新的HashSet(150);
随机rndm=新随机();
对于(int i=0;i<150;i++)
{
names.Add($“{firstNames[rndm.Next(firstNames.Length)]}”+
$“{lastNames[rndm.Next(lastNames.Length)]}”;
}
WriteLine($“{names.Count}/{firstNames.Length*lastNames.Length}”);
Console.ReadKey();
不要忘记,真正的随机是不可能模拟的。。。所以你总是会有一些重复的分布和更高的数字


只需切换到下面,这样您就可以为这两个应用程序使用相同的随机实例

int index2 = firstn.Next(lastNames.Length);

Random
实际上并不生成随机数,而是伪随机数。这意味着,您需要一个起始值,即所谓的种子。根据该值计算第一个数字。由此,我们可以计算出另一个数字,依此类推。这些数字看起来是随机的,但实际上它们是由种子决定的。如果你有相同的种子,你总是得到相同的数字序列

您的
Random
类实际上有一个构造函数,您可以在其中传递种子。你可以在这里尝试:对于同一个种子,你总是会得到相同的数字序列

如果使用不带参数的构造函数,则当前时间将作为种子。这有一个很大的优点,当你重新启动程序时,你总是会得到一个不同的数字序列。但在您的示例中,您遇到了一个问题:如果创建
Random
的两个实例之间的时间没有改变,因为计算机速度太快,它们将具有相同的种子,因此具有相同的数字序列。这就是为什么
index
index2
都有相同的值。只需使用相同的
Random
实例来生成两个索引,它们的值不一定相同:

Random random = new Random();
int index = random .Next(firstNames.Length);
int index2 = random .Next(lastNames.Length);
Console.WriteLine($"The random name is {firstNames[index]}" + $" {lastNames[index2]}");

尝试对两个索引使用相同的
Random
实例。我如何做到这一点?int index2=firstn.Next(lastNames.Length);它起作用了!谢谢大家!@TimRutter在这个问题上添加一个答案,这样我就可以将你的答案标记为最佳答案。这实际上回答了OP的问题吗?是的,因为OP的问题是由于默认种子井上的.net Core中的错误造成的,在我的.net Core 3.1机器上,一个或两个随机实例之间绝对没有区别。。。虽然我同意创建一个单一的更有意义。请看我提供的示例,它使用两个不同的实例生成相同的结果。.Net Framework:-.Net Core:.Net Framework/.Net Core之间的差异在这个答案中进行了解释。