gpt4 book ai didi

c# - 从 IList<> 中选择一个随机元素而不是这个元素

转载 作者:行者123 更新时间:2023-11-30 18:50:19 25 4
gpt4 key购买 nike

我有这个模式,我需要从列表中选择任何随机元素,而不是当前元素(作为参数传递)。我想出了这个方法:

public Element GetAnyoneElseFromTheList(Element el)
{
Element returnElement = el;
Random rndElement = new Random();
if (this.ElementList.Count>2)
{
while (returnElement == el)
{
returnElement = this.ElementList[rndElement.Next(0,this.ElementList.Count)];
}

return returnElement;
}
else return null;
}

但是那个 while 循环已经困扰了我几天几夜,我需要好好睡一觉。还有其他好的方法吗? IE。以固定步数返回的东西?

编辑:在我的例子中,列表保证包含要避免的“el”元素,并且列表不包含重复项,但看到一些更一般的情况也会很有趣。

最佳答案

public Element GetAnyoneElseFromTheList(Element el)
{
if(this.ElementList.Count < 2) return null;
Random rndElement = new Random();
int random = rndElement.Next(0,this.ElementList.Count -1);
if(random >= this.ElementList.indexOf(el)) random += 1;
return this.ElementList[random];
}

获取一个介于 0 和列表长度减去 2 之间的随机数。

如果该数字大于或等于您的元素的索引,则对该数字加一。

返回该数字索引处的元素

编辑:有人在评论中提到,他们随后删除了评论,如果您有重复项,这将不会很好地工作。在这种情况下,最好的解决方案实际上是。

public Element GetAnyoneElseFromTheList(int elId)
{
if(elId >= this.ElementList.Count) throw new ArgumentException(...)
if(this.ElementList.Count < 2) return null;
Random rndElement = new Random();
int random = rndElement.Next(0,this.ElementList.Count -1);
if(random >= elId) random += 1;
return this.ElementList[random];
}

编辑 2:重复元素的另一种替代方法是,您可以对列表的克隆版本使用优化的洗牌(随机排序)操作,然后遍历整个列表。 foreach 将迭代到列表中重复元素的数量。这一切都取决于您的洗牌算法的优化程度。

关于c# - 从 IList<> 中选择一个随机元素而不是这个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1393451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com