Random 如何从xy坐标生成种子

Random 如何从xy坐标生成种子,random,seed,prng,Random,Seed,Prng,Iv'e一直在编写柏林脚本,但在创建简单的伪随机值方面遇到了问题 我需要能够从xy坐标创建种子值,但x+y在循环值方面存在明显问题。它们也进入负空间,所以x^y不起作用 很抱歉,如果这已经在其他地方得到了回答,但不是我不明白就是找不到它。首先取x和y的绝对值;然后x^y就可以正常工作了。创建伪随机源的最简单方法之一是随时间变化。您可以尝试将x^y乘以当前系统时间;此方法生成重复种子值的可能性极低。首先获取x和y的绝对值;然后x^y就可以正常工作了。创建伪随机源的最简单方法之一是随时间变化。您可以

Iv'e一直在编写柏林脚本,但在创建简单的伪随机值方面遇到了问题

我需要能够从xy坐标创建种子值,但x+y在循环值方面存在明显问题。它们也进入负空间,所以x^y不起作用


很抱歉,如果这已经在其他地方得到了回答,但不是我不明白就是找不到它。

首先取
x
y
的绝对值;然后
x^y
就可以正常工作了。创建伪随机源的最简单方法之一是随时间变化。您可以尝试将
x^y
乘以当前系统时间;此方法生成重复种子值的可能性极低。

首先获取
x
y
的绝对值;然后
x^y
就可以正常工作了。创建伪随机源的最简单方法之一是随时间变化。您可以尝试将
x^y
乘以当前系统时间;此方法生成重复种子值的可能性极低。

如果知道值的范围,只需将x和y转换为填充有零的字符串,附加两个字符串,然后通过哈希函数运行生成的字符串。

如果知道值的范围,您可以简单地将x和y转换为填充有零的字符串,附加这两个字符串,然后通过哈希函数运行结果字符串。

您需要更好地定义问题以获得最佳答案

如果x和y值相对较小,则可以将它们放入整数的高部分和低部分(您的语言中的种子是整数吗),例如,对于32位平台:


int seed=x您需要更好地定义问题以获得最佳答案

如果x和y值相对较小,则可以将它们放入整数的高部分和低部分(您的语言中的种子是整数吗),例如,对于32位平台:


int seed=x是否要为每个x,y对分配一个可重复的随机数

使用x,y的线性或一般函数组合作为种子将在分布中产生伪影(至少如果您不使用非常复杂的函数)。 试试这个,我也有同样的问题,它对我有效

//seeded random for JS - integer
function irnd2()
{
    a=1664525;
    c=1013904223;
    m=4294967296;
    rnd2.r=(rnd2.r*a+c)%m;
    return rnd2.r;
}

//seeded random for JS - double [0,1]
function rnd2()
{
    a=1664525;
    c=1013904223;
    m=4294967296;
    rnd2.r=(rnd2.r*a+c)%m;
    return rnd2.r/m;
}


rnd2.r=192837463;

//seed function
function seed2(s)
{
    s=s>0?s:-s;
    rnd2.r=192837463^s;
}

//my smart seed from 2 integer
function myseed(x,y)
{
seed2(x);//x is integer
var sx=irnd2();//sx is integer
seed2(y);//y is integer
var sy=irnd2();//sy is integer
seed2(sx^sy);//using binary xor you won't lose information 
}
为了使用它:

myseed(x,y);
irnd2();
通过这种方式,您可以获得良好的不相关随机序列


我在JS中使用它,但如果seed的参数和rnd的返回值是一个整数,它在其他语言中也应该可以工作。

是否要为每个x,y对分配一个可重复的随机数

使用x,y的线性或一般函数组合作为种子将在分布中产生伪影(至少如果您不使用非常复杂的函数)。 试试这个,我也有同样的问题,它对我有效

//seeded random for JS - integer
function irnd2()
{
    a=1664525;
    c=1013904223;
    m=4294967296;
    rnd2.r=(rnd2.r*a+c)%m;
    return rnd2.r;
}

//seeded random for JS - double [0,1]
function rnd2()
{
    a=1664525;
    c=1013904223;
    m=4294967296;
    rnd2.r=(rnd2.r*a+c)%m;
    return rnd2.r/m;
}


rnd2.r=192837463;

//seed function
function seed2(s)
{
    s=s>0?s:-s;
    rnd2.r=192837463^s;
}

//my smart seed from 2 integer
function myseed(x,y)
{
seed2(x);//x is integer
var sx=irnd2();//sx is integer
seed2(y);//y is integer
var sy=irnd2();//sy is integer
seed2(sx^sy);//using binary xor you won't lose information 
}
为了使用它:

myseed(x,y);
irnd2();
通过这种方式,您可以获得良好的不相关随机序列

我在JS中使用它,但如果seed的参数和rnd的返回值是一个整数,它在其他语言中也可以使用。

在C#中,根据alexroat的答案进行了修改和改进。只要设置Random.seed=MyUtils.GetSeedXY(x,y),就可以开始了

public static class MyUtils
{
    static int seed2(int _s)
    {
        var s = 192837463 ^ System.Math.Abs(_s);
        var a = 1664525;
        var c = 1013904223;
        var m = 4294967296;
        return (int) ((s * a + c) % m);
    }

    public static int GetSeedXY(int x, int y)
    {
        int sx = seed2(x * 1947);
        int sy = seed2(y * 2904);
        return seed2(sx ^ sy);
    }
}
在C#中,根据alexroat的回答进行了改编和改进。只要设置Random.seed=MyUtils.GetSeedXY(x,y),就可以开始了

public static class MyUtils
{
    static int seed2(int _s)
    {
        var s = 192837463 ^ System.Math.Abs(_s);
        var a = 1664525;
        var c = 1013904223;
        var m = 4294967296;
        return (int) ((s * a + c) % m);
    }

    public static int GetSeedXY(int x, int y)
    {
        int sx = seed2(x * 1947);
        int sy = seed2(y * 2904);
        return seed2(sx ^ sy);
    }
}

与其他一些备选方案相比,速度非常慢。这是我目前正在做的,但感觉没有那么有效。与其他一些备选方案相比,速度非常慢。这是我目前正在做的,但感觉没有那么有效。^的问题是,如果许多点接近原点,你的随机种子空间会非常倾斜。也许这是可以接受的。类似于不使用^为带有偏差值的整数集创建哈希的推理,例如,为什么Java的字符串哈希函数使用31的幂而不是^计算单个字符的Ascii值。我不太明白为什么,但与x+y一样,x^y似乎也会在2d数组中生成值的对角对称性。@josh247:这是因为+和^都是可交换的。交换操作数的顺序,得到相同的结果。看看我的答案,避免对角对称。我的回答中有几个问题。如果你详细说明这些,我可以提供更好的帮助。^的问题是,如果许多点靠近原点,你的随机种子空间将非常倾斜。也许这是可以接受的。类似于不使用^为带有偏差值的整数集创建哈希的推理,例如,为什么Java的字符串哈希函数使用31的幂而不是^计算单个字符的Ascii值。我不太明白为什么,但与x+y一样,x^y似乎也会在2d数组中生成值的对角对称性。@josh247:这是因为+和^都是可交换的。交换操作数的顺序,得到相同的结果。看看我的答案,避免对角对称。我的回答中有几个问题。如果你详细说明这些,我会更好地帮助你。对不起,我不太擅长这样的措辞。坐标进入负空间,种子值可以是任何浮点或int。我使用python中的随机模块。我试着使用你的建议,虽然我不完全明白为什么,但它似乎有效。我完成了将脚本扩展到三维的工作,并使用了x。对不起,我不太擅长这样的措辞。坐标进入负空间,种子值可以是任何浮点或int。我使用python中的随机模块。我尝试使用你的建议,但它似乎有效,尽管我不完全理解为什么。Iv'e完成了将脚本扩展到三维的工作,并使用了x。当算法传递负整数时,不会引发异常,生成的种子将生成镜像值。例如,种子值x=-1y=0和x=1y=0将返回相同的值