gpt4 book ai didi

java - 在有限区域的中心位置周围随机出现 "walk"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:27 25 4
gpt4 key购买 nike

我不确定我是否能正确表达这个问题,但就是这样......

我想编写一个示例,其中小点具有它们移动所依据的速度 - 而且,还有一个随机运动叠加到“正确”运动上。使用下面的 Processing 代码,我得到以下动画:

marbles.gif

右边的点应该朝向右下角,我对它的行为没意见。问题是左边的点,它应该是“静态的”——所以它只会显示“就地”的“随机”运动;然而,正如动画 .gif 所示,它最终往往会偏离其原始位置一段距离。随机速度计算如下:

this.randspeed.set(random(0,1)-0.5, random(0,1)-0.5);

我猜想 random(0,1)-0.5 不会给我一个以零为中心(或收敛?到)零的类似高斯的“正态分布”;但话又说回来,即使它是一个“适当的”高斯,我仍然可以有这样的“运气”,也就是说,一整天都返回正值 [0:0.5),然后返回负值 [-0.5:0)第二天返回,最后,它仍然是一个适当的高斯分布。

所以,我想,我正在寻找一种方法将(伪?)随机序列(如 random(0,1)-0.5 生成的序列)转换为伪随机序列-随机一个,但其中 N 个样本(比如 10)的平均总和为 0。我不确定如何调用它 - 我猜是一个周期性收敛到零的随机序列??

请注意,我一直在尝试在下面直接更改 position;并通过更改 finalpos 来保存 position - 更改位置似乎更像是一种“自然”的平滑运动(尤其是在模数框架操作中,因此新的随机速度不是t分配每一帧);但是,它也允许随机噪声累积,并将点“推”离其中心位置。另外,请注意,我花了一些时间才可以在 .gif 上重现它,“实时”运行程序似乎会导致该点更快地偏离原始位置(我读过一些有关硬件事件的信息,例如 hard-磁盘写入用于在 Linux 上更改 /dev/random 的熵,但我真的不知道它是否相关)。

此外,我考虑过在点位置周围设置某种虚拟边界,并对超出边界的随机运动进行碰撞检测 - 但在我看来这似乎需要太多工作(以及 vector 的 CPU 周期)操作)对于这种事情;相反,我本来希望随机函数可以以某种方式以更简单的方式“调和”。

那么,是否有推荐的方法来处理这种在有限区域内围绕中心位置的随机运动?


marbles.pde:

import java.util.*; // added for Iterator;

ArrayList<Marble> marbles = new ArrayList<Marble>();
Iterator<Marble> imarb;
color mclr = #0000FF;
int RNDLIMIT = 2;
int framecount = 0;

void setup() {
size(600,400,P2D);
Marble m_moving = new Marble(width/2, height/2, 2, 2);
marbles.add(m_moving);
Marble m_stopped = new Marble(width/2-100, height/2, 0, 0);
marbles.add(m_stopped);
}

void draw() {
background(255);

strokeWeight(1);
stroke(mclr);
fill(mclr);

imarb = marbles.iterator();
while (imarb.hasNext()) {
Marble m = imarb.next();
m.update();
ellipse(m.finalpos.x, m.finalpos.y, m.radius*2, m.radius*2);
}
framecount++;
//~ saveFrame("marbles-######.png");
}

class Marble {

PVector position = new PVector(0,0);
PVector finalpos = new PVector(0,0);
PVector speed = new PVector(0,0);
PVector randspeed = new PVector(0,0);
float radius=4;

public Marble() {
}

public Marble(float inx, float iny, float invx, float invy) {
this.position.set(inx, iny);
this.speed.set(invx, invy);
}

public void update() {
this.position.add(this.speed);
if (framecount % 4 == 0) {
this.randspeed.set(random(0,1)-0.5, random(0,1)-0.5);
this.randspeed.setMag(RNDLIMIT);
}
int algoTry = 1; // 0
switch(algoTry) {
case 0:
this.finalpos.set(PVector.add(this.position, this.randspeed));
break;
case 1:
this.position.set(PVector.add(this.position, this.randspeed));
this.finalpos.set(this.position);
break;
}
}
}

最佳答案

典型的“随机游走”总是蜿蜒而行,因为统计数据不会“平衡”。向左移动很多不会因向右移动而得到纠正。所以随机性的质量不是问题。

如果您希望点停留在特定位置附近,您应该存储该位置并使“正确”运动(如您所说)始终向该位置移动。从目标位置减去当前位置应该可以让您获得正确的“正确” Action 。使用此解决方案,点将始终倾向于回到起点。

关于java - 在有限区域的中心位置周围随机出现 "walk"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22262251/

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