Javascript 创建绑定循环的数学序列
我试图根据一个数学序列创建一个伪随机数 我创建了两个种子,以及一个每次调用种子时都会更新种子的函数:Javascript 创建绑定循环的数学序列,javascript,binding,qml,Javascript,Binding,Qml,我试图根据一个数学序列创建一个伪随机数 我创建了两个种子,以及一个每次调用种子时都会更新种子的函数: 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: {
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;
}
属性变量选项卡:{
var选项卡=[];
对于(var i=0;i,您的代码工作正常。由于您不绑定属性,而只是通过=运算符赋值,我猜绑定循环发生在其他地方。如果您想在函数内绑定属性,则需要显式使用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();
}
}
更新
好的,在你的评论之后,我可以看到你的问题是什么。事实上,这很有趣。我花了一些时间研究这个问题,但找不到绑定循环来自何处的答案。但是有两种方法可以解决这个问题:
解决方案1
就我个人而言,我只需为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);
}
}
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);
}
}
在根元素的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++来处理这些事情。
也许我至少能帮你一点忙,即使原因还不清楚。你是对的,但我认为这仍然是因为它。我编辑了我的问题,添加了引起绑定循环的部分。感谢你的回答,我得到了一些不同的东西,但没有你那么好。我最终使用了解决方案1,但创建了一个createArray fu我还是不明白这里发生了什么。
qml: two
qml: one: one plus three
qml: two: undefined
qml: three: function() { [code] }
qml: four: one plus three
qml: fiveAndSix: six