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

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

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

4

3 回答 3

3

您可以将它们用作种子:

int seed = 
    BitConverter.ToInt32(BitConverter.GetBytes(
        x * 17 + y
    ));
new Random(seed).NextDouble();
于 2012-08-29T17:04:29.347 回答
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;
    }
}
于 2012-08-29T17:04:01.063 回答
1

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

public float GetHashCode(float x, float y)
{
    float somePrimeNumber = 17.0
    return Math.Abs(1.0 / (x.GetHashCode() * somePrimeNumber + y.GetHashCode() + 1));
}
于 2012-08-29T17:09:26.677 回答