如何从数组中抓取一个随机元素而不多次抓取同一个元素? [复制]

Posted

技术标签:

【中文标题】如何从数组中抓取一个随机元素而不多次抓取同一个元素? [复制]【英文标题】:How to grab a random element from an array without grabbing the same element more than once? [duplicate] 【发布时间】:2014-12-14 20:56:40 【问题描述】:

当我使用arc4random_uniform() 方法从数组中抓取一个元素时,通常会多次抓取该数组的同一个元素。我正在尝试使数组中的每个元素只被抓取一次。我试图这样做的原因是UITableView 中的多个单元格没有相同的文本。这是UITableView 中单元格文本的数组:

var definitions = ["Used to carry the pharoah","Used to carry bodies as a ceremony","Had a flat deck to carry a farmer's treasure","Daily, it made a trip around the world to carry Ra","Towed by smaller boats, carrying heavy objects","Used for business and pleasure by officials/nobles","Carried most Egyptians and some goods"]

在我的viewDidLoad() 方法中,我这样做是为了调用definitions 的随机元素:

self.boats = [Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))])]

如何更改我的代码,使两个元素不会在我的UITableView 中显示两次?谢谢!

【问题讨论】:

要对数组进行随机排序吗? 您要查找的内容称为“随机洗牌”或“随机排列”。 Fisher-Yates shuffle 是一种可能的实现方式。 【参考方案1】:

保留随机索引值的列表,如果后续随机索引在该列表中,则跳过它并生成另一个随机索引。

【讨论】:

这不是最好的方法,如果你想得到所有的元素,它会在最后变得非常低效。 同意。另一种方法是使用具有 n 个元素的链表。生成一个随机索引 i, 1 更好的选择是打乱一组值并遍历打乱的集合(以获得整个集合),或者如果你想要一个子集,则使用Floyd's unique subset algorithm。

以上是关于如何从数组中抓取一个随机元素而不多次抓取同一个元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

swiftyJSON 从数组中抓取随机索引

php中如果从一堆元素中随机出2个元素,举个例子:张三,李四,王五,刘六...有十个名字,

当一些 <ul> 没有 <li> 子元素时,从 <ul> 数组中抓取 <li>

如何从 html 源代码中具有相同属性集和相同层次结构的 2 个元素中抓取单个元素(使用 python 的美丽汤)

如何从数组中随机选择四个元素而不用Java重复?

解决 UiPath RPA 无法抓取软件界面上元素的方法