试图转换一些代码,但对于我所有的谷歌搜索,我无法弄清楚如何转换这个位。
float fR = fHatRandom(fRadius);
float fQ = fLineRandom(fAngularSpread ) * (rand()&1 ? 1.0 : -1.0);
float fK = 1;
这一点
(rand()&1 ? 1.0 : -1.0);
我想不通。
它是 1 或 -1,有 50/50 的机会。
等效的 C# 代码是:
((new Random().Next(0, 2)) == 0) ? 1.0 : -1.0;
Next(0,2)
将返回 0 或 1。
如果代码被多次调用,您应该存储实例Random
并重新使用它。当您创建它的新实例时,Random
它会使用确定伪随机数序列的种子进行初始化。为了获得更好的“随机性”,您不应该经常重新初始化随机序列。
您可以使用
Random rnd = new Random();
(rnd.NextInt(2) * 2 -1); // 1 or -1
C++ 示例生成一个随机数,使用其最低位并丢弃其余位。然后使用最低位来选择 -1 或 1。
在 C# 中,等价物如下。
new Random().Next(0, 2) * 2 - 1
重要提示:如果您在循环中执行此操作,请存储Random
某处的实例并仅Next
在循环中调用,而不是再次调用构造函数。这不仅仅是性能优化。否则,您将看到持续时间约为 100 毫秒的相同位序列,因此对 Random 的无参数构造函数的调用应该很少且相距甚远,理想情况下,每次应用启动时调用一次。
1.0 或 -1.0,其中任一概率均等
rand() 生成一个与 0x01 相加的数字,即第一位,取决于你是否得到一个位,你得到 1.0 或 -1.0
正如其他人所说,你可以随机化 50% 的机会。
如果你想要一个准确的翻译,那就是:
((new Random().Next() & 1 > 0) ? 1.0 : -1.0)
您必须从条件表达式的第一部分中创建一个布尔值。