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