gpt4 book ai didi

javascript - 数学序列创建绑定(bind)循环

转载 作者:行者123 更新时间:2023-12-03 11:55:50 25 4
gpt4 key购买 nike

我正在尝试根据数学序列创建伪随机数。

我创建了两个种子,以及一个在每次调用时更新种子的函数:

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;
}

由于“res”是根据两个种子计算的,并且种子2更新为res,因此系统检测到绑定(bind)循环。但它不应该:在这里,我不想绑定(bind)另一个变量,我只想要它的值。

如何防止 Seed2 和 res 之间发生绑定(bind)?

以及seed1 和seed2 之间?

等等...

最佳答案

您的代码工作正常。由于您不绑定(bind)属性,而只是通过 = 运算符赋值,所以我猜绑定(bind)循环发生在其他地方。如果要在函数内绑定(bind)属性,则需要显式使用 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();
}
}

更新

好的,在您发表评论后我可以看到您的问题所在。事实上这很有趣。我花了一些时间来解决这个问题,但找不到绑定(bind)循环来自何处的答案。但有两种方法可以解决这个问题:

解决方案1

就我个人而言,我会简单地使用一个数组作为选项卡属性,并在发出组件的创建信号时对其进行初始化,如下所示:

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);
}
}

解决方案2

我发现,当您将 pAlea 函数的逻辑移至属性初始化中时,绑定(bind)循环问题就消失了,如下所示:

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);
}
}

像你一样初始化属性(至少据我所知)并不常见。基本上,您将大括号内的表达式绑定(bind)到属性,并且由于 Qt 做了一些解释魔法,因此初始化如何影响属性行为或如何解析绑定(bind)并不总是显而易见的,例如:

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++ 来处理此类事情。

也许我至少能够帮助你一点点,即使原因仍不清楚..

关于javascript - 数学序列创建绑定(bind)循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com