随机对象到列表而不重复
Random objects to a list without repetition
我这边有点问题。我有一个问题列表 KlausimuList
,我必须形成另一个列表 Atsitiktinis
将是一个随机长度,并且会从 KlausimuList
中提取随机问题。我的方法有效,但问题是 - 问题重复。你能给我写一个他们没有的代码吗?我有一个想法,为我已经添加的问题制作一个单独的 int 索引数组,然后每次检查该问题是否已经在该列表中。如果是这样 - 生成一个新号码,但我只是不知道如何为这个东西编写代码:D。感谢您的建议。代码在 c# 中。
static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis)
{
Random kiek = new Random();
int kiekis = kiek.Next(1, KlausimuList.Count);
for (int i = 0; i < kiekis; i++)
Atsitiktinis.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)]);
}
这应该有效。它创建原始列表的副本并从中删除已使用的项目:
static List<Klausimas> FormuotiAtsisiktini(List<Klausimas> KlausimuList)
{
Random kiek = new Random();
List<Klausimas> source = new List<Klausimas>(KlausimuList);
List<Klausimas> result = new List<Klausimas>();
int kiekis = kiek.Next(1, KlausimuList.Count);
for (int i = 0; i < kiekis; i++)
{
var match = source[kiek.Next(0, source.Count - 1)];
result.Add(match);
source.Remove(match);
}
return result;
}
您所描述的称为无放回采样,this SO post 中提供了解决方案。此外,为确保您确实向 collection 添加了重复项,请考虑使用 HashSet
而不是 List
。
您可以使用 HashSet
来避免重复。 Add
方法在 HashSet
returns false
尝试添加重复项目时。
static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis)
{
Random kiek = new Random();
int kiekis = kiek.Next(1, KlausimuList.Count);
HashSet<Klausimas> hashset= new HashSet<Klausimas>();
for (int i = 0; i < kiekis;)
{
i+= hashset.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)])? 1:0; // returns true when successfully added.
}
Atsitiktinis = hashset.ToList();
}
我这边有点问题。我有一个问题列表 KlausimuList
,我必须形成另一个列表 Atsitiktinis
将是一个随机长度,并且会从 KlausimuList
中提取随机问题。我的方法有效,但问题是 - 问题重复。你能给我写一个他们没有的代码吗?我有一个想法,为我已经添加的问题制作一个单独的 int 索引数组,然后每次检查该问题是否已经在该列表中。如果是这样 - 生成一个新号码,但我只是不知道如何为这个东西编写代码:D。感谢您的建议。代码在 c# 中。
static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis)
{
Random kiek = new Random();
int kiekis = kiek.Next(1, KlausimuList.Count);
for (int i = 0; i < kiekis; i++)
Atsitiktinis.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)]);
}
这应该有效。它创建原始列表的副本并从中删除已使用的项目:
static List<Klausimas> FormuotiAtsisiktini(List<Klausimas> KlausimuList)
{
Random kiek = new Random();
List<Klausimas> source = new List<Klausimas>(KlausimuList);
List<Klausimas> result = new List<Klausimas>();
int kiekis = kiek.Next(1, KlausimuList.Count);
for (int i = 0; i < kiekis; i++)
{
var match = source[kiek.Next(0, source.Count - 1)];
result.Add(match);
source.Remove(match);
}
return result;
}
您所描述的称为无放回采样,this SO post 中提供了解决方案。此外,为确保您确实向 collection 添加了重复项,请考虑使用 HashSet
而不是 List
。
您可以使用 HashSet
来避免重复。 Add
方法在 HashSet
returns false
尝试添加重复项目时。
static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis)
{
Random kiek = new Random();
int kiekis = kiek.Next(1, KlausimuList.Count);
HashSet<Klausimas> hashset= new HashSet<Klausimas>();
for (int i = 0; i < kiekis;)
{
i+= hashset.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)])? 1:0; // returns true when successfully added.
}
Atsitiktinis = hashset.ToList();
}