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

时间:2012-08-29 17:00:53

标签: c# random

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

所以我的问题是我需要随机数与x和y相关。如果我传入x = 10,y = 5,当我传入x = 10时,我得到0.34567f,第二次y = 5,我再次需要0.34567f的结果。有谁知道这样做的方法?

编辑:根据以下回复,我意识到我遗漏了一些东西。我传递Random对象的原因是因为它已在其他地方预先播种。因此,如果我传入x = 10,y = 5表示种子为50的随机对象,并且使用种子为51的Random对象做同样的事情应该给我一些不同的东西。

3 个答案:

答案 0 :(得分:3)

您可以将它们用作种子:

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

答案 1 :(得分:2)

使用x和y作为种子值

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

注意:^运算符对x和y的位执行XOR运算。


更新(响应SLaks,Servy和Scott Chamberlain的评论)

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

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

答案 2 :(得分:1)

看起来你真正需要的是哈希,而不是随机数。如果您需要基于两个浮点数的序列随机数,那么我建议使用这两个浮点数来制作种子,但是当您只想要一个效率低得多的单个值时,也不会哈希特别棒。你可以尝试这样的事情。

public float GetHashCode(float x, float y)
{
    float somePrimeNumber = 17.0
    return Math.Abs(1.0 / (x.GetHashCode() * somePrimeNumber + y.GetHashCode() + 1));
}