我做了一个非常简单的补丁,当触发爆炸时,它旨在触发0-2之间的唯一数字,换句话说,不会重复数字。
按照我设置的方式,它是理论上的工作。甚至我的编程指导者都说,从理论上讲,它应该起作用,而且他通常是一个非常聪明的人。他被非正式地称为学院的幕僚。
更多细节:
在完全相同的设置下,purr数据和纯数据中都会发生这种情况。
没有使用外部库。只是普通的香草对象。
由于似乎没有办法附加实际文件本身,因此我将张贴代码的图像:
答案 0 :(得分:4)
问题在于深度优先处理(由Pd使用)和相关的堆栈展开,因为这可能导致将[select]
的第二个输入设置为旧值(您没想到的)。
注意:select:in0
表示[select]
的最左侧入口,... [random]
生成的数字以粗体显示( 1
),并且输出补丁的数字以粗斜体显示(例如 3
)
想象一下[select]
初始化为0
,而[random 3]
对象输出列表 2 0 0 2 0 2 ...
(提示:[seed 96(
)
预期输出为 2 0 2 0 2 ...
,但是实际输出为 2 0 2 2 2 ...
现在,如果您连续向随机生成器发送[bang(
,就会发生这种情况:
random
生成 2
2
发送到sel:in0
,然后将其与0
进行比较(不匹配)
sel:out1
(拒绝出口)中,并显示数字 2
sel:in1
之后,将其内部状态设置为2
。 random
生成 0
0
发送到sel:in0
,然后将其与2
进行比较(不匹配)
sel:out1
中,并显示数字 0
sel:1
之后,将其内部状态设置为0
。random
生成 0
0
发送到sel:in0
,然后将其与0
进行比较(匹配!)
sel:out0
(比赛出口)发出爆炸声
random
的新呼叫,该呼叫现在会生成 2
2
发送到sel:in0
,然后将其与0
进行比较(不匹配)
sel:out1
中,并显示数字 2
sel:1
之后,将其内部状态设置为2
。0
(仍在trigger:out0
中待发送)发送到sel:1
,将其内部状态设置为0
!!! random
生成 0
0
发送到sel:in0
,然后将其与0
进行比较(匹配!)
sel:out0
发出爆炸声
random
的新呼叫,该呼叫现在会生成 2
2
发送到sel:in0
,然后将其与0
进行比较
sel:out1
中,并显示数字 2
sel:1
之后,将其内部状态设置为2
。0
(仍在trigger:out0
中待发送)发送到sel:1
,将其内部状态设置为0
!!! 如您所见,在#3的末尾,[select]
的内部状态为0
,即使[random]
生成的最后一个数字为2
(因为由于堆栈展开,[trigger]
的最左侧出口只会在发送完0
后发送到2
。
解决方案很简单:确保[select]
的状态包含最后显示的值,而不是堆栈上生成的最后一个值。修改内部状态时避免反馈。
例如(使用本地发送/接收到更好的ASCII技术)
[r $0-again]
|
[bang(
|
[random 3]
|
| [r $0-last]
| |
[select]
| |
| [t f f]
| | |
| | [s $0-last]
| |
| [print]
|
[s $0-again]