我试图根据数学序列创建伪随机数。
我创建了两个种子,以及每次调用种子时更新种子的函数:
property var seed1: 12;
property var seed2: 23;
function pAlea(m) {
var res = (seed1 + seed2) % m;
seed1 = seed2;
seed2 = res
return res;
}
然后我尝试创建一个包含伪随机值的数组:
property var tab: {
var tab = [];
for (var i = 0; i <10; i++) {
tab.push(pAlea(100));
}
return tab;
}
因为&#34; res&#34;根据两个种子计算,并将seed2更新为res,系统检测绑定循环。但它不应该:在这里,我不想绑定另一个我只想要它的值。
如何防止在seed2和res之间发生绑定?
和seed1和seed2之间的beet?
依旧......
答案 0 :(得分:1)
您的代码运行正常。既然你没有绑定属性,只是简单地通过=运算符赋值,我想绑定循环正在其他地方发生。如果要绑定函数内的属性,则需要显式使用Qt.bind()。这段代码适合我:
import QtQuick 2.2
Rectangle {
property var seed1: 12;
property var seed2: 23;
function pAlea(m) {
var res = (seed1 + seed2) % m;
seed1 = seed2;
seed2 = res
console.log("res: " + res);
return res;
}
Timer {
id: timer;
interval: 1000; running: true; repeat: true
onTriggered: pAlea(5);
}
Component.onCompleted: {
timer.start();
}
}
好的,在您发表评论后,我可以看到您的问题是什么。事实上它非常有趣。我花了一些时间在这上面,并且无法找到绑定循环来自的答案。但有两种方法可以解决这个问题:
我个人只是将一个数组用于tab属性,并在发出组件的创建信号时对其进行初始化,如下所示:
import QtQuick 2.2
Rectangle {
property var seed1: 12;
property var seed2: 23;
property var tab: [];
function pAlea(m) {
var res = (seed1 + seed2) % m;
seed1 = seed2;
seed2 = res
console.log("res: " + res);
return res;
}
Component.onCompleted: {
for (var i = 0; i <10; i++) {
tab.push(pAlea(100));
}
console.log("tab (after completion): " + tab);
}
}
我发现当你将pAlea函数的逻辑移动到属性初始化时,绑定循环问题就消失了,如下所示:
import QtQuick 2.2
Rectangle {
property var seed1: 12;
property var seed2: 23;
property var tab: {
var result = [];
var m = 100;
for (var i = 0; i <10; i++) {
var res = (seed1 + seed2) % m;
seed1 = seed2;
seed2 = res
result.push(res);
}
return result;
}
Component.onCompleted: {
console.log("finished: " + tab);
}
}
像你一样初始化属性(至少据我所知)并不常见。基本上你将花括号内的表达式绑定到属性,并且因为Qt做了一些解释魔法,所以初始化如何影响属性行为或如何解析绑定并不总是很明显,例如:
import QtQuick 2.2
Rectangle {
property var one: {
"one"
}
property var two: {
console.log("two");
}
property var three: {
function() { console.log("three");}
}
property var four: {
one+=" plus three";
}
property var fiveAndSix: {
five : "five";
six : "six";
}
}
在根元素的onCompleted函数中将属性(与上面相同的顺序)打印到调试控制台会显示一些意想不到的事情:
qml: two
qml: one: one plus three
qml: two: undefined
qml: three: function() { [code] }
qml: four: one plus three
qml: fiveAndSix: six
有些事情更明显,有些事情令人惊讶(但我应该走到尽头,尽管这很有趣......)。就个人而言,我会尽量避免这样(我会称之为)内联属性定义,而是处理初始化,如解决方案1中所示,或者使用C ++进行此类操作。
也许我能够帮助你至少一点点,即使为什么仍然不清楚。