我正在从头开始创建一个迷你家庭游戏,我使用随机选择块在 1 到 27 之间进行选择。我有 27 个背景,上面写着 1 到 27 个数字。但是我注意到在大约 21-22 个数字之后,随机选择器无法选择任何剩余的数字。下面是我的代码的样子 -
如何修复此代码以确保它随机选择 1 到 27 之间的所有内容?
您的问题是由于“包含”块的工作方式造成的。很自然地假设它会将您给它的值与列表中的每个值进行比较,如果匹配则评估为“真”,如果不匹配则评估为“假”。但不幸的是,这不是它的作用。相反,它将列表视为通过连接列表中的所有元素(用空格分隔每个元素)形成的单个字符串,然后检查您询问的内容是否包含在该字符串中。
如果您运行此代码段,您可以看到这一点:
你会发现你的精灵实际上会说“你好”,即使列表中的任何地方都没有包含“2 3”!
在您的脚本中,这具有排除某些个位数数字的效果,具体取决于选择数字的顺序。例如,该数字1极不可能被选中,因为您可以选择的数字1中几乎有一半都包含数字。同样2。其他数字被排除的可能性要低得多,但这是一个非零的机会,至少其中一些数字往往出于同样的原因被排除在外。
换句话说,当您选择了 27 个号码中的大约 20 到 22 个时,剩下的其余号码将被视为已被选中,即使它们没有被选中。
如果你实现了一个适当的“包含”块,你可以让你的脚本工作,像这样:
然后你可以像这样在你的主脚本中使用它:
综上所述,您选择随机数的方法并不理想,因为您必须执行此循环并反复选择和忽略一些数字,并且随着循环的进行越来越多。如果您开始不得不从更大范围的数字中进行选择,这可能会变得非常棘手。
最好实施为适当的“洗牌”。为此有一个标准算法,称为Fisher-Yates shuffle。本质上,你用你想要选择的所有数字初始化你的列表,从第一个元素开始,选择一个随机的其他元素与该元素交换(你所在的元素可以被选择),交换值,然后移动到下一个元素。在每次迭代中,您只从列表中剩余的元素中选择一个新元素。
我将 Fisher-Yates shuffle 在您的 Scratch 程序中的实现留给您和其他读者。这是一个很好的编程练习。:)