1

试图转换一些代码,但对于我所有的谷歌搜索,我无法弄清楚如何转换这个位。

    float fR = fHatRandom(fRadius);
    float fQ = fLineRandom(fAngularSpread ) * (rand()&1 ? 1.0 : -1.0);
    float fK = 1;

这一点

(rand()&1 ? 1.0 : -1.0); 

我想不通。

4

5 回答 5

7

它是 1 或 -1,有 50/50 的机会。

等效的 C# 代码是:

((new Random().Next(0, 2)) == 0) ? 1.0 : -1.0; 

Next(0,2)将返回 0 或 1。

如果代码被多次调用,您应该存储实例Random并重新使用它。当您创建它的新实例时,Random它会使用确定伪随机数序列的种子进行初始化。为了获得更好的“随机性”,您不应该经常重新初始化随机序列。

于 2012-10-21T19:06:13.287 回答
3

您可以使用

Random rnd = new Random();
(rnd.NextInt(2) * 2 -1); // 1 or -1
于 2012-10-21T19:11:12.137 回答
2

C++ 示例生成一个随机数,使用其最低位并丢弃其余位。然后使用最低位来选择 -1 或 1。

在 C# 中,等价物如下。

new Random().Next(0, 2) * 2 - 1

重要提示:如果您在循环中执行此操作,请存储Random某处的实例并仅Next在循环中调用,而不是再次调用构造函数。这不仅仅是性能优化。否则,您将看到持续时间约为 100 毫秒的相同位序列,因此对 Random 的无参数构造函数的调用应该很少且相距甚远,理想情况下,每次应用启动时调用一次。

于 2012-10-21T19:18:15.627 回答
1

1.0 或 -1.0,其中任一概率均等

rand() 生成一个与 0x01 相加的数字,即第一位,取决于你是否得到一个位,你得到 1.0 或 -1.0

于 2012-10-21T19:09:01.227 回答
0

正如其他人所说,你可以随机化 50% 的机会。

如果你想要一个准确的翻译,那就是:

((new Random().Next() & 1 > 0) ? 1.0 : -1.0)

您必须从条件表达式的第一部分中创建一个布尔值。

于 2012-10-21T19:11:08.980 回答