【问题标题】:Generating a random number related to input parameters生成与输入参数相关的随机数
【发布时间】:2012-08-29 17:00:52
【问题描述】:
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 的随机对象做同样的事情应该会给我一些不同的东西。

【问题讨论】:

  • 可能有点矫枉过正,但您可以使用加密哈希。 SHA1 或 MD5 什么的。这样可以保证为相同的输入获得相同的输出。
  • 听起来你真的不需要一个 random 数字,你只需要一个基于两个浮点数的哈希。搜索这些字词可能会给您带来更好的结果。

标签: c# random


【解决方案1】:

您可以将它们用作种子:

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

【讨论】:

  • 我偷偷怀疑你的意思是转移而不是繁殖。不过可能是错的。
  • @lc 不,你乘以一个素数,然后将它们相加,因此将 1 传递给 x 和 2 传递给 y 不会产生与 2 对应 x 和 1 对应 y 相同的数字。请参阅this SO question and answer,详细了解您选择质数的原因。
  • @ScottChamberlain 嗯,很有趣。感谢您的解释。但在这种情况下,您将与 (2,17) 和 (3,0) 发生冲突,这并不重要。
  • 谢谢!如果我从种子随机数中添加一个随机值,这将起作用。
  • @lc 是的,由于pigeonhole principle,冲突无法避免。简单来说,如果你有 11 个东西和 10 个盒子放在里面,那么一个盒子里会有 2 个东西(在播种 Random 的上下文中,我们有 int.MAX_INT 盒子(根据 MSDN Random 的绝对值seed 所以 -12341234 为随机数生成器提供相同的值。))
【解决方案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 的 cmets)

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

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

【讨论】:

  • 那不会编译。此外,它将围绕原点对称。
  • 看来 OP 真的只需要一个哈希。虽然这在技术上是一个哈希,但它并不是最好的(当然也不是最有效的)解决方法。
  • 对于那些不知道“围绕原点对称”意味着x = 1, y = 2 将产生与x = 2, y = 1 相同的结果
【解决方案3】:

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

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

【讨论】:

  • //Return a random number between 0 - 1
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多