Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成与输入参数相关的随机数_C#_Random - Fatal编程技术网

C# 生成与输入参数相关的随机数

C# 生成与输入参数相关的随机数,c#,random,C#,Random,所以我的问题是,我需要随机数与x和y相关。如果我通过x=10,y=5,当我第二次通过x=10,y=5时,我得到0.34567f,我需要一个0.34567f的结果。有人知道这样做的方法吗 编辑:根据下面的回答,我意识到我遗漏了一些东西。我传入随机对象的原因是因为它已在其他地方预先设定种子。因此,如果我对种子数为50的随机对象传入x=10,y=5,然后得到0.34567f,对种子数为51的随机对象做同样的事情,会得到不同的结果。使用x和y作为种子值 public float randomNumber

所以我的问题是,我需要随机数与x和y相关。如果我通过x=10,y=5,当我第二次通过x=10,y=5时,我得到0.34567f,我需要一个0.34567f的结果。有人知道这样做的方法吗


编辑:根据下面的回答,我意识到我遗漏了一些东西。我传入随机对象的原因是因为它已在其他地方预先设定种子。因此,如果我对种子数为50的随机对象传入x=10,y=5,然后得到0.34567f,对种子数为51的随机对象做同样的事情,会得到不同的结果。

使用x和y作为种子值

public float randomNumber(float x, float y, Random rnd)
{
    //Return a random number between 0 - 1
}

注意:
^
运算符对x和y的位执行异或运算


更新(回应SLaks、Servy和Scott Chamberlain的评论)

你的“随机数”根本不是随机数。您可能需要的是哈希代码

public float RandomNumber(float x, float y)
{
    var rnd = new Random(x.GetHashCode() ^ y.GetHashCode());
    return (float)rnd.NextDouble();
}

使用x和y作为种子值

public float randomNumber(float x, float y, Random rnd)
{
    //Return a random number between 0 - 1
}

注意:
^
运算符对x和y的位执行异或运算


更新(回应SLaks、Servy和Scott Chamberlain的评论)

你的“随机数”根本不是随机数。您可能需要的是哈希代码

public float RandomNumber(float x, float y)
{
    var rnd = new Random(x.GetHashCode() ^ y.GetHashCode());
    return (float)rnd.NextDouble();
}

您可以将它们用作种子:

public Hash(float x, float y)
{
    unchecked {
        return Math.Abs((527 + x) * 31 + y) % 1.0f;
    }
}

您可以将它们用作种子:

public Hash(float x, float y)
{
    unchecked {
        return Math.Abs((527 + x) * 31 + y) % 1.0f;
    }
}

看起来你真正需要的是一个散列,而不是一个随机数。如果需要一个基于两个浮点数的随机数序列,那么我建议使用这两个浮点数来生成种子,但是当您只需要一个值时,这两个值的效率都要低得多,而且对于散列也不是特别好。你可以试试这样的

int seed = 
    BitConverter.ToInt32(BitConverter.GetBytes(
        x * 17 + y
    ));
new Random(seed).NextDouble();

看起来你真正需要的是一个散列,而不是一个随机数。如果需要一个基于两个浮点数的随机数序列,那么我建议使用这两个浮点数来生成种子,但是当您只需要一个值时,这两个值的效率都要低得多,而且对于散列也不是特别好。你可以试试这样的

int seed = 
    BitConverter.ToInt32(BitConverter.GetBytes(
        x * 17 + y
    ));
new Random(seed).NextDouble();


可能是杀伤力过大,但可以使用加密哈希。SHA1或MD5什么的。这保证了对相同的输入得到相同的输出。听起来你并不需要一个随机数,你只需要一个基于两个浮点数的散列。搜索这些术语可能会得到更好的结果。可能是杀伤力过大,但可以使用加密哈希。SHA1或MD5什么的。这保证了对相同的输入得到相同的输出。听起来你并不需要一个随机数,你只需要一个基于两个浮点数的散列。搜索这些术语可能会得到更好的结果,但这不会编译。此外,它将围绕原点对称。似乎OP真的只需要一个散列。虽然从技术上讲这是一个散列,但这并不是解决这个问题的最佳(当然也不是最有效)方法。对于那些不知道“围绕原点对称”的人来说,这意味着
x=1,y=2
将产生与
x=2,y=1
相同的结果,而
x=2,y=1
不会编译。此外,它将围绕原点对称。似乎OP真的只需要一个散列。虽然从技术上讲这是一个散列,但这并不是解决这个问题的最佳(当然也不是最有效的)方法。对于那些不知道“围绕原点对称”的人来说,这意味着
x=1,y=2
将产生与
x=2,y=1
相同的结果,我有一种偷偷的怀疑,你是想移位而不是乘法。可能是错的。@lc不,你乘以一个素数,然后把它们加在一起,这样在x中输入1,在y中输入2不会产生与x中输入2,在y中输入1相同的数字。有关为什么选择质数的详细解释,请参阅。@ScottChamberlain,嗯,很有趣。谢谢你的解释。但在这种情况下,你会遇到(2,17)和(3,0)的碰撞,这可能并不重要。谢谢!如果我从种子随机数中添加一个随机值,这会起作用。@lc是的,冲突是不可能防止的,因为。简单来说,如果你有11件东西和10个盒子要放进去,那么某件东西将在一个盒子里放两件东西(在播种随机数的上下文中,我们有
int.MAX_int
盒子(每个随机数取
种子的绝对值,所以
-1234
1234
用相同的值播种随机数生成器。)我偷偷地怀疑你是想转移而不是繁殖。可能是错的。@lc不,你乘以一个素数,然后把它们加在一起,这样在x中输入1,在y中输入2不会产生与x中输入2,在y中输入1相同的数字。有关为什么选择质数的详细解释,请参阅。@ScottChamberlain,嗯,很有趣。谢谢你的解释。但在这种情况下,你会遇到(2,17)和(3,0)的碰撞,这可能并不重要。谢谢!如果我从种子随机数中添加一个随机值,这会起作用。@lc是的,冲突是不可能防止的,因为。简单来说,如果你有11件东西和10个盒子要放进去,那么某件东西将在一个盒子里放两件东西(在播种随机数的上下文中,我们有
int.MAX_int
盒子(每个随机数取
种子的绝对值,所以
-1234
1234
用相同的值播种随机数生成器。)
//返回0-1之间的随机数
//返回0-1之间的随机数