- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 a comment 中看到了这段代码对于文章“Never-ending Shuffled Sequence”。我了解基本前提,但我不知道它是如何工作的。 我最需要的解释是 while 循环的前两行。
(因为它是用 MATLAB 编写的,所以我只能猜测这段代码的功能。)
probabilities = [1 1 1 1 1 1];
unrandomness = 1;
while true
cumprob = cumsum(probabilities) ./ sum(probabilities);
roll = find(cumprob >= rand, 1)
probabilities = probabilities + unrandomness;
probabilities(roll) = probabilities(roll) - 6*unrandomness;
if min(probabilities) < 0
probabilities = probabilities - min(probabilities);
end
end
最佳答案
概率
向量表示选择数字 1 到 6 的可能性的相对权重。一开始,他们都有平等的机会被选中。我将遍历 while 循环的每一行来解释它的作用:
while 循环中的第一行根据 probabilities
向量创建一个累积概率。 CUMSUM函数用于返回沿向量长度的累积和,并将其除以向量的总和(使用 SUM 函数找到)。在第一次通过循环时,cumprob
将具有以下值:
0.1667 0.3333 0.5000 0.6667 0.8333 1.0000
请注意,这些创建了一个从 0 到 1 的随机数可以落入的“箱子”。一个数字落入给定箱子的概率等于该箱子的宽度,因此 6 分之 1 (0.1667 ) 随机抽取的数字落入第一个 bin(从 0 到 0.1667)或第二个 bin(从 0.1667 到 0.3333)等的机会。
while 循环中的第二行选择一个随机数(使用 RAND 函数)并找到 cumprob
中大于该值的第一个元素的索引(使用FIND 函数)。因此,roll
值是一个从 1 到 6 的数字。
while 循环中的第三行通过向上移动所有相对权重来增加“非随机性”,使所有数字的概率更接近于相等。考虑以下示例,其中 probabilities
具有以下形式:
[x x x 1 x x]
其中 x
是某个大于 1 的值。此时,选择值 4 的概率为 1/(5*x+1)
。通过将所有元素加 1,该概率变为 2/(5*x+7)
。对于 x = 3
,4 出现的概率增加从 0.0625 到 0.0909,而任何其他数字出现的概率减少从 0.1875 到 0.1818 .这种“非随机性”因此起到了标准化概率的作用。
while 循环中的第四行基本上与前一行相反,它显着降低了刚刚发生的任何数字的相对权重,使其不太可能在后续循环中发生。由于前一行不断尝试使所有数字的发生概率恢复相等的影响,这种发生可能性的降低将是短暂的。
请注意,从 probabilities
的一个元素中减去的数量等于添加到上一行中所有元素的总量,导致总和的净变化为零概率
向量。这使概率
中的值保持有界,这样它们就不会不断增长。
while 循环末尾的 if 语句只是为了确保 probabilities
中的所有数字都是正数。如果向量的最小值(使用 MIN 函数找到)小于零,则从向量的每个元素中减去该值。这将确保 cumprob
向量的值始终介于 0 和 1 之间。
如果将 while true
语句替换为 for i = 1:6
,则显示probabilities
向量和roll
code> value 在每次迭代结束时运行代码几次,您可以看到代码是如何完成它的工作的。这是一组这样的 6 卷,从数字 1 到 6 中的每一个都画一次:
roll probabilities
5 | 6 6 6 6 0 6
|
4 | 7 7 7 1 1 7
|
2 | 8 2 8 2 2 8
|
1 | 3 3 9 3 3 9
|
3 | 4 4 4 4 4 10
|
6 | 5 5 5 5 5 5
请注意 probabilities
中的最终值是如何相等的,这意味着在这一点上,数字 1 到 6 再次被选中的可能性相同。
关于matlab - 这个 MATLAB 代码是如何工作的? (概率和随机序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1566150/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!