gpt4 book ai didi

c# - 我似乎无法根据坐标生成伪随机数

转载 作者:行者123 更新时间:2023-11-30 16:52:18 24 4
gpt4 key购买 nike

我正在尝试创建由 PRNG 程序生成的 1 和 0 的无限 map ,但仅存储可见的 7x7 网格。例如在屏幕上,您会看到一个 7x7 的网格,其中显示了 1 和 0 的 map 的一部分,当您向右推时,它会移动 1 和 0,并将下一行放在适当的位置。

如果您随后向左移动,因为它是伪随机生成的,它会重新生成并显示原始文件。您将能够无限地向上和向下移动。

我遇到的问题是初始 map 看起来不是那么随机,并且当您向右或向左滚动时图案会自行重复,我认为这与我生成数字的方式有关。例如您可以从查看 x=5000 和 y=10000 开始,因此它需要从这两个值生成一个唯一的种子。

(复杂度是视口(viewport)大小的变量)

void CreateMap(){
if(complexity%2==0) {
complexity--;
}

if (randomseed) {
levelseed=Time.time.ToString();
}

psuedoRandom = new System.Random(levelseed.GetHashCode());
offsetx=psuedoRandom.Next();
offsety=psuedoRandom.Next();
levellocation=psuedoRandom.Next();

level = new int[complexity,complexity];
middle=complexity/2;

for (int x=0;x<complexity;x++){
for (int y=0;y<complexity;y++){
int hashme=levellocation+offsetx+x*offsety+y;
psuedoRandom = new System.Random(hashme.GetHashCode());
level[x,y]=psuedoRandom.Next(0,2);
}
}
}

这是我用来左右移动的,

    void MoveRight(){
offsetx++;
for (int x=0;x<complexity-1;x++){
for (int y=0;y<complexity;y++){
level[x,y]=level[x+1,y];
}
}

for (int y=0;y<complexity;y++){
psuedoRandom = new System.Random(levellocation+offsetx*y);
level[complexity-1,y]=psuedoRandom.Next(0,2);
}
}

void MoveLeft(){
offsetx--;
for (int x=complexity-1;x>0;x--){
for (int y=0;y<complexity;y++){
level[x,y]=level[x-1,y];
}
}

for (int y=0;y<complexity;y++){
psuedoRandom = new System.Random(levellocation+offsetx*y);
level[0,y]=psuedoRandom.Next(0,2);
}
}

要提炼它,我需要能够设置

Level[x,y]=Returnrandom(offsetx,offsety)

int RandomReturn(int x, int y){
psuedoRandom = new System.Random(Whatseedshouldiuse);
return (psuedoRandom.Next (0,2));
}

最佳答案

我认为你的问题是你正在循环中创建一个“新的”随机...不要像现在这样重新声明内部循环...而是在类级别声明它然后简单地使用 psuedoRandom.Next 例如参见 this SO post for an example of the issue you are experiencing

而不是像您正在做的那样在每次迭代时重新实例化 Random() 类:

for (int x=0;x<complexity;x++){
for (int y=0;y<complexity;y++){
int hashme=levellocation+offsetx+x*offsety+y;
psuedoRandom = new System.Random(hashme.GetHashCode());
level[x,y]=psuedoRandom.Next(0,2);
}
}

做一些更像是

for (int x=0;x<complexity;x++){
for (int y=0;y<complexity;y++){
// Give me the next random integer
moreRandom = psuedoRandom.Next();
}
}

编辑:正如 Enigmativity 在这篇文章下方的评论中指出的那样,在每次迭代时重新启动也是一种时间/资源的浪费。

附言如果您确实需要这样做,那么为什么不使用“依赖于时间的默认种子值”而不是指定一个?

关于c# - 我似乎无法根据坐标生成伪随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32715428/

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