C# 来自另一个列表c的随机对象列表#

C# 来自另一个列表c的随机对象列表#,c#,list,random,C#,List,Random,我有一个名单所有英雄的私人名单 以及一份所有团队的名单私人名单 在我用英雄填充我的“所有英雄”列表后,我想使用以下方法创建由5个随机英雄组成的团队: public Team createTeam() { int index=0; Team t = new Team(); Random rnd = new Random(); int cap = allHeroes.Count; while (t.count() < 5) { i

我有一个名单
所有英雄的私人名单

以及一份所有团队的名单
私人名单

在我用英雄填充我的“所有英雄”列表后,我想使用以下方法创建由5个随机英雄组成的团队:

public Team createTeam()
{
    int index=0;
    Team t = new Team();
    Random rnd = new Random();
    int cap = allHeroes.Count;
    while (t.count() < 5)
    {
        index = rnd.Next(0, cap);
        t.Add(allHeroes.ElementAt(index));
    }
    return t;
}
公共团队createTeam() { int指数=0; 团队t=新团队(); 随机rnd=新随机(); int cap=所有英雄。计数; while(t.count()<5) { 索引=rnd.Next(0,cap); t、 添加(allHeroes.ElementAt(索引)); } 返回t; }

这将创建一个完美的团队,但如果我想创建更多的团队,它将一次又一次地生成同一个团队。
我也有一个方法

public List<HeroStats> print()
{
    StringBuilder sb = new StringBuilder();
    List<HeroStats> l = new List<HeroStats>();
    foreach (HeroStats h in team)
    {
         sb.AppendLine(h.HeroName);
         l.Add(h);
    }
    Console.WriteLine(sb.ToString());
    return l; 
}
公共列表打印()
{
StringBuilder sb=新的StringBuilder();
列表l=新列表();
foreach(团队中的HeroStats h)
{
某人的姓名;
l、 加(h);
}
Console.WriteLine(sb.ToString());
返回l;
}
应该打印出团队中英雄的名字。

如果我产生了很多,为什么我会得到同一个团队



要创建我使用的多个团队:

Team a = new Team();
            for (int i = 0; i < 2000; i++)
            {
                a = createTeam();
               allTeams.Add(a);

         }
Team a=新团队();
对于(int i=0;i<2000;i++)
{
a=createTeam();
所有小组。添加(a);
}

如果您在大致相同的时间创建多个
随机
实例,它们可能会生成相同的数字。相反,在其他地方创建一个
Random
,并从算法中调用其
Next
方法。

如果您在大致相同的时间创建多个
Random
实例,它们很可能会生成相同的数字。相反,在其他地方创建一个
Random
,并从算法中调用其
Next
方法。

您需要

 Random rnd = new Random();

public Team createTeam()
{

}
可能在rnd中解析为参数。

您需要

 Random rnd = new Random();

public Team createTeam()
{

}

可能将rnd中的解析作为参数。

它正在创建相同的团队,因为
随机
实例是在方法中创建的,如果调用
createTeam
非常快(将当前时间用作种子),该方法将导致相同的种子。您可以通过将
Random
传递给方法或使用字段来避免这种情况:

public Team createTeam(Random rnd) // as an aside, you should call it CreateRandomTeam
{
    int index=0;
    Team t = new Team();
    int cap = allHeroes.Count;
    while (t.count() < 5)
    {
        index = rnd.Next(0, cap);
        t.Add(allHeroes.ElementAt(index));
    }
    return t;
}
在备注部分也提到了这一点:

默认种子值源自系统时钟,具有有限的 决议因此,在中创建的不同随机对象 通过调用默认构造函数关闭继承将具有 相同的默认种子值,因此将产生相同的 随机数集。这个问题可以通过使用单个 随机对象生成所有随机数。你也可以四处工作 通过修改系统时钟返回的种子值,然后 将此新种子值显式提供给随机变量(Int32) 建造师


它正在创建相同的团队,因为
Random
实例是在方法中创建的,如果您非常快地调用
createTeam
(使用当前时间作为种子),该方法将导致相同的种子。您可以通过将
Random
传递给方法或使用字段来避免这种情况:

public Team createTeam(Random rnd) // as an aside, you should call it CreateRandomTeam
{
    int index=0;
    Team t = new Team();
    int cap = allHeroes.Count;
    while (t.count() < 5)
    {
        index = rnd.Next(0, cap);
        t.Add(allHeroes.ElementAt(index));
    }
    return t;
}
在备注部分也提到了这一点:

默认种子值源自系统时钟,具有有限的 决议因此,在中创建的不同随机对象 通过调用默认构造函数关闭继承将具有 相同的默认种子值,因此将产生相同的 随机数集。这个问题可以通过使用单个 随机对象生成所有随机数。你也可以四处工作 通过修改系统时钟返回的种子值,然后 将此新种子值显式提供给随机变量(Int32) 建造师

Random

默认种子值源自系统时钟,具有有限分辨率。因此,通过调用默认构造函数连续创建的不同随机对象将具有相同的默认种子值,因此将生成相同的随机数集

如果您在紧密循环中调用
createTeam()
来创建随机团队,那么由于
random
的实例彼此非常接近,并且具有相同的种子,因此最终将得到相同的随机数集

一种可能的解决方案是取出类型为
Random
的对象,并使其成为类级字段

public static class RandomTeamCreator
{
    private static readonly Random _random = new Random();
    public Team CreateTeam()
    {
        // create team using _random
    }
}
Random

默认种子值源自系统时钟,具有有限分辨率。因此,通过调用默认构造函数连续创建的不同随机对象将具有相同的默认种子值,因此将生成相同的随机数集

如果您在紧密循环中调用
createTeam()
来创建随机团队,那么由于
random
的实例彼此非常接近,并且具有相同的种子,因此最终将得到相同的随机数集

一种可能的解决方案是取出类型为
Random
的对象,并使其成为类级字段

public static class RandomTeamCreator
{
    private static readonly Random _random = new Random();
    public Team CreateTeam()
    {
        // create team using _random
    }
}
如果我产生了很多,为什么我会得到同一个团队

可能是因为创建团队之间的时间不足以让内部时钟创建新的随机种子

我将向
createTeam
添加一个“seed”参数:

public Team createTeam(int seed)
{
    int index=0;
    Team t = new Team();
    Random rnd = new Random(seed);
    int cap = allHeroes.Count;
    while (t.count() < 5)
    {

        index = rnd.Next(0, cap);
        t.Add(allHeroes.ElementAt(index));
    }
    return t;
}
如果要保留原始签名,只需添加一个重载:

public Team createTeam()
{
    return createTeam(new Random().Next());
}
旁注

你可能想要一个“洗牌”的英雄团队,而不是一个“随机”的团队,因为“随机”可以让同一个英雄出现两次。如果是这种情况,则只需使用随机顺序的“order by”:

public Team createTeam(int seed)
{
    Random rnd = new Random(seed);

    Team t = new Team();

    var shuffled = allHeroes.OrderBy(rnd.Next()).Take(5);
    foreach(var hero in shuffled)
        t.Add(hero);

    return t;
}
如果我是ge,为什么我会得到同一个团队