rand() % 1
来决定的。但它感觉不太随机。我在启动时使用了
srand
和ctime
,但似乎出现了相同的模式。是否有任何算法可以创建非常随机的数?或者有任何建议可以改进
rand()
?rand() % 1
来决定的。但它感觉不太随机。srand
和ctime
,但似乎出现了相同的模式。rand()
?真正的随机性通常看起来并不那么随机。但至少你可以立即采取一些措施,避免仅使用最低位比特。引用C语言数值计算方法:
如果您想生成1到10之间的随机整数,应始终使用高位比特,例如
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
而且从不使用任何类似的东西进行
j = 1 + (rand() % 10);
(使用较低位)。
此外,您可能考虑使用具有更好性能的不同 RNG。 Xorshift 算法是很好的选择。它速度快、代码简洁,只需几行 C 代码就足够了,并且在统计方面应该对于任何游戏都足够好。
bool tile = rand() > (RAND_MAX / 2);
rand()
给您的所有位。大多数随机数生成器可以分解为具有某些随机性和统计特性的位流。该流上均匀间隔的各个位不必具有相同的特性。在这里,您实际上正在丢弃14到31位伪随机性。
您可以仅缓存由调用rand()
生成的数字,并使用其每个位(当然,这将取决于RAND_MAX
),因此如果您的RAND_MAX
是32768,则可以使用该数字的最低阶15位按顺序。特别是如果RAND_MAX
很小,则您不会处理生成器的低阶位,因此从高位获取位不会获得太多好处。例如,Microsoft CRT使用以下方程式生成随机数:
xn + 1 = xn · 214013 + 2531011
然后移除该结果的最低16位并将其限制为15位。因此,在那里没有来自生成器的低位。尽管对于RAND_MAX
高达231的生成器,这在很大程度上仍然成立,但有时您不能指望它(因此,在那里可能只限制自己使用来自高位的16或24位)。
因此,通常情况下,只需缓存对rand()
的调用结果,并按顺序使用该数字的位于您的应用程序中,而不是使用rand()%2
。
C++11实现Mersenne旋转算法的方式如下。来自cppreference.com:
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 6);
for (int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
我多年来一直成功地使用 Mersenne Twister 随机数生成器。它的源代码可以从广岛大学数学系这里获取。(直接链接,省去了阅读日文的麻烦!)
这个算法的优点在于:
对于你的游戏,我建议你看看它。
随机的“是”或“否”的完美方式是切换它们。您可能不需要随机函数。
int random() { return 4; } // 完全随机选择的数字
。 - Cecil Has a Name让你的数字看起来更随机的一种简便方法是每次条件if(rand() % 50==0)
为真时重新生成。