C# 我能';似乎不会根据坐标生成伪随机数

C# 我能';似乎不会根据坐标生成伪随机数,c#,seeding,procedural-generation,C#,Seeding,Procedural Generation,我试图创建一个由PRNG程序生成的1和0的无限映射,但只存储一个7x7的网格,可以查看。e、 g.在屏幕上,您将看到一个7x7网格,其中显示了1和0的部分地图,当您向右推时,它会将1和0移动,并将下一行放置到位 如果随后按伪随机生成的方式向左移动,则会重新生成并显示原始图像。你将能够改变任何一种方式和向上和向下无限 我的问题是,初始贴图看起来不是那么随机,当你向右或向左滚动时,图案会重复,我认为这与我如何生成数字有关。e、 g.您可以从查看x=5000和y=10000开始,因此需要从这两个值生成

我试图创建一个由PRNG程序生成的1和0的无限映射,但只存储一个7x7的网格,可以查看。e、 g.在屏幕上,您将看到一个7x7网格,其中显示了1和0的部分地图,当您向右推时,它会将1和0移动,并将下一行放置到位

如果随后按伪随机生成的方式向左移动,则会重新生成并显示原始图像。你将能够改变任何一种方式和向上和向下无限

我的问题是,初始贴图看起来不是那么随机,当你向右或向左滚动时,图案会重复,我认为这与我如何生成数字有关。e、 g.您可以从查看x=5000和y=10000开始,因此需要从这两个值生成唯一的种子

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


我认为你的问题是你正在创建一个“新的”随机循环。。。不要像现在这样重新声明内部循环。。。而是在类级别声明它,然后简单地使用psuedoRandom

与在每次迭代时重新实例化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我会用它来散列坐标:

  • 它的实现相对简单
  • 它以一个键(地图的种子)和一条消息(坐标)作为输入
  • 作为质量/性能权衡,您可以增加或减少轮数
  • 与您的代码不同,结果将在过程和机器之间重复
SipHash网站列出了两个C#实现:


我玩了一些游戏来创建
rnd(x,y,seed)

类程序
{
const int Min=-1000;//定义起点
静态void Main(字符串[]参数)
{
对于(int x=0;x<10;x++)
{
对于(int y=0;y<10;y++)
Console.Write((RND(x,y,123)%100).ToString().PadLeft(4));
Console.WriteLine();
}
Console.ReadKey();
}
静态整数RND(整数x,整数y,整数种子)
{
var rndX=新随机(种子);
var rndY=new Random(seed+123);//有点不同
//因为随机是LCG,所以我们只能前进
对于(int i=Min;ireturn rndX.Next()+rndY.Next()在你们提出了各种方法之后,我用这个解决了这个问题

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

对于(int x=0;xIs是否存在所需地图的某些最大尺寸,例如1024 x 1024个条目?不,我正在尝试使其看起来无限大。例如,您可以从查看坐标10000、445554开始,该坐标也将完全随机生成。保持简单,假设世界是100 x 100,视口位于位置60,60。因此,您可以看到x中60-66和y中60-66的网格。x(60),y(60)应填充随机1或0,x(61),y(60)也应填充随机1或0。因此,我需要有一个唯一的值来根据我认为的2个坐标进行种子设定?是if(randomseed)是真是假…如果是假,什么是levelseed?@Munkybunky你的问题是你正在循环中创建一个“新”随机数…不要像现在这样重新声明内部循环…而是在类级别声明它,然后简单地使用psuedoRandom.NextAlso你可能应该指出调用
新随机数(someSeedValue)是浪费时间
。如果您创建了
Random
的单个实例,那么调用
newrandom()就足够了
。如果它是静态的,例如没有移动,我想这会起作用。例如,5x5网格,在上面使用x和y坐标由随机性生成的每一行上都有10001。你向左移动,从新坐标生成随机性,column 2移动到第1列,然后你有一个外观不同的第1列,其中可能填充了1。我想我需要的是一个wa因此,如果我参考地图x和y中的偏移量,我将始终得到相同的结果如果我要求你给我一个1到0之间的随机数作为坐标200,50,你说0,那么我要求你多加载一个,然后再次要求你为坐标提供一个1到0之间的随机数-坐标200,50你会给我同样的结果。@Munkybunky-听起来你确实需要使用
新随机数(someSeedValue)
,因为你想从同一坐标获得相同的值。问题是
.GetHashCode()
不是特别随机的,所以你的随机数不是那么随机。
int RandomReturn(int x, int y){
    psuedoRandom = new System.Random(Whatseedshouldiuse);   
    return (psuedoRandom.Next (0,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);
    }
}
for (int x=0;x<complexity;x++){
    for (int y=0;y<complexity;y++){
        // Give me the next random integer
        moreRandom = psuedoRandom.Next(); 
    }
}
class Program
{
    const int Min = -1000; // define the starting point

    static void Main(string[] args)
    {
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 10; y++)
                Console.Write((RND(x, y, 123) % 100).ToString().PadLeft(4));
            Console.WriteLine();
        }
        Console.ReadKey();
    }

    static int RND(int x, int y, int seed)
    {
        var rndX = new Random(seed);
        var rndY = new Random(seed + 123); // a bit different
        // because Random is LCG we can only move forward
        for (int i = Min; i < x - 1; i++)
            rndX.Next();
        for (int i = Min; i < y - 1; i++)
            rndY.Next();
        // return some f(x, y, seed) = function(rnd(x, seed), rnd(y, seed))
        return rndX.Next() + rndY.Next() << 1;
    }
}
    void Drawmap(){
    for (int x=0;x<complexity;x++){
        for (int y=0;y<complexity;y++){
            psuedoRandom = new System.Random((x+offsetx)*(y+offsety));
            level[x,y]=psuedoRandom.Next (0,2);
        }
    }