将一个table不超过两个相同类别的元素依次打乱
Shuffle a table without more than two elements of the same category one after the other
我正在构建一个应用程序,要求用户识别情绪。情绪以图像的形式出现。有 6 个类别,每个类别有 10 个图像(喜悦、悲伤、惊喜等)。图片的呈现有两个条件:
- 必须是随机的
- 同一类别的图片不得连续出现两张。
我已经把 60 张图片放在一个 table 中了,当然,当我打乱它时,我遇到了第二个条件的问题。
我正在考虑在代码中有更多的 tables 来手动遵守第二个条件,但它看起来很不优雅(六个 tables 被打乱并一个接一个地阅读).
有没有人有更好的主意?
编辑
感谢大家的回答。更准确地说,我想知道是否有某种数学公式可以直接做到这一点。
每个 "Category" 应该由一个 "table" 表示。这样你就可以轻松地洗牌每个 "table" 并从中拉出前两个以满足你的两个条件。你是对的,这不是很优雅,但这取决于你的用例和未来的变化。
您可以创建一个面向对象的设计来表示您的结构,其中图像将具有成员字段 "category"。这样你就有了一张图片 table,可以将它洗牌并从一开始就通过检查每个图片 "category" 成员字段来提取正确数量的类别。
你有任何代码或更多关于你想追求的东西的描述吗?
解决这个问题的一种方法是将结果构建为一系列块,其中包含每个类别中的一个元素,逐块随机排序,并从中随机选择每个特定图像那些在该类别中仍未分配的人。在这种情况下,同一类别的两个项目只能在两个块相邻的地方连续出现。
例如,第一个块可能包含来自类别 (2, 3, 0, 5, 4, 1) 的图像,第二个来自类别 (5, 1, 2, 0, 3, 4),第三个类别(4、5、0、3、1、2)等
这种方法并不像简单地打乱单个数组那么简单,但是您已经知道用这种简单的方法无法满足您的要求。
此方法也不会生成满足您标准的所有可能图像序列,但它生成的那些序列都是等概率的。
它的优点是算法会自动满足这两个标准——您不必在任何时候测试结果来验证,也不必在接受之前修改任何部分或预期的整体结果。
一个相当复杂的算法,但允许最大随机数。
- 首先将 10 张图片的 6 个类别打乱
- 第一张图片从 10 个类别中随机选择 1 个并弹出最后一张图片
- 以下传球:
- 从可用类别中随机选择 1 个,忽略最后选择的类别和可能为空的类别 - 请注意结束的特殊情况,请参见下文
- 弹出该类别的最后一张图片
结束的特殊情况:当我们随机选择时,我们可以在这种情况下以一个包含图像的类别结束(在将一个放在最后一个位置之后),列出所有可能的插入点(而不是在插入点之前或之后)同一类别的图像)并在那里插入弹出的图像。迭代直到插入所有图像
看起来很复杂,但每一步都相当简单,而且很容易测试。最后一次集成测试,您可以对代码充满信心。没有特别优化,但是只有60张图片,如果不经常使用应该可以接受
我正在构建一个应用程序,要求用户识别情绪。情绪以图像的形式出现。有 6 个类别,每个类别有 10 个图像(喜悦、悲伤、惊喜等)。图片的呈现有两个条件:
- 必须是随机的
- 同一类别的图片不得连续出现两张。
我已经把 60 张图片放在一个 table 中了,当然,当我打乱它时,我遇到了第二个条件的问题。
我正在考虑在代码中有更多的 tables 来手动遵守第二个条件,但它看起来很不优雅(六个 tables 被打乱并一个接一个地阅读).
有没有人有更好的主意?
编辑
感谢大家的回答。更准确地说,我想知道是否有某种数学公式可以直接做到这一点。
每个 "Category" 应该由一个 "table" 表示。这样你就可以轻松地洗牌每个 "table" 并从中拉出前两个以满足你的两个条件。你是对的,这不是很优雅,但这取决于你的用例和未来的变化。
您可以创建一个面向对象的设计来表示您的结构,其中图像将具有成员字段 "category"。这样你就有了一张图片 table,可以将它洗牌并从一开始就通过检查每个图片 "category" 成员字段来提取正确数量的类别。
你有任何代码或更多关于你想追求的东西的描述吗?
解决这个问题的一种方法是将结果构建为一系列块,其中包含每个类别中的一个元素,逐块随机排序,并从中随机选择每个特定图像那些在该类别中仍未分配的人。在这种情况下,同一类别的两个项目只能在两个块相邻的地方连续出现。
例如,第一个块可能包含来自类别 (2, 3, 0, 5, 4, 1) 的图像,第二个来自类别 (5, 1, 2, 0, 3, 4),第三个类别(4、5、0、3、1、2)等
这种方法并不像简单地打乱单个数组那么简单,但是您已经知道用这种简单的方法无法满足您的要求。
此方法也不会生成满足您标准的所有可能图像序列,但它生成的那些序列都是等概率的。
它的优点是算法会自动满足这两个标准——您不必在任何时候测试结果来验证,也不必在接受之前修改任何部分或预期的整体结果。
一个相当复杂的算法,但允许最大随机数。
- 首先将 10 张图片的 6 个类别打乱
- 第一张图片从 10 个类别中随机选择 1 个并弹出最后一张图片
- 以下传球:
- 从可用类别中随机选择 1 个,忽略最后选择的类别和可能为空的类别 - 请注意结束的特殊情况,请参见下文
- 弹出该类别的最后一张图片
结束的特殊情况:当我们随机选择时,我们可以在这种情况下以一个包含图像的类别结束(在将一个放在最后一个位置之后),列出所有可能的插入点(而不是在插入点之前或之后)同一类别的图像)并在那里插入弹出的图像。迭代直到插入所有图像
看起来很复杂,但每一步都相当简单,而且很容易测试。最后一次集成测试,您可以对代码充满信心。没有特别优化,但是只有60张图片,如果不经常使用应该可以接受