- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了一个Pong我不得不随机 throw 球的游戏。为此,我使用了内置的随机数生成器,并在 Ubuntu/GCC 中获得了不错的结果。在将代码移植到 Mac 并编译时,球只会朝一个方向转换,这意味着 clang 中的 rand()
函数没有按预期工作。
我已经恢复到自定义数字生成器,但这是游戏中最初有问题的代码:
srand(time(NULL));
float ang = ((float)rand())/RAND_MAX * 120 - 60;
int side = (int)(((float)rand())/RAND_MAX * 2);
经过进一步检查,我创建了以下测试程序并在两个平台上编译和运行它。
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv) {
while (1) {
int now = time(NULL);
printf("Time now is %d\n", now);
srand(now);
int random = rand();
printf("Random number generated is %d\n", random);
sleep(1);
}
}
结果(根据 RAND_MAX
制表和计算,在两个系统上都是 2147483647
)如下:
结果不言而喻。虽然 clang 版本中存在随机性,但与 RAND_MAX
的值相比,随机性非常差,标准差为 0 证明了这一点,而 gcc 上的标准差为 0.328。
rand()
在 clang 上的这种不良行为的原因是什么?我还想在头文件中看到这个函数的引用实现。这似乎是不标准的,而且我一定不是唯一一个在使用这种方法将程序移植到 Mac 时遇到问题的人。在使用/依赖随机数生成器时,还有哪些其他设计原则是好的做法?
最佳答案
所以我不知道 apple 的 rand clang 实现的确切实现,但我知道它是作为 LCG 或线性同余生成器完成的。它的工作方式基本上是一个公式:
在公式中,将是 RAND_MAX
,和 是由编译器定义的一些常量。 Apple 的 Clang 分别使用了 16807
和 0
。
rand()
的返回值是 ,最后返回的 rand()
或您在 srand()
中输入的值将是 .
如果你只是想要一个有点随机的数字序列,这很好用,因为它最终会返回 0
和 RAND_MAX
之间的所有数字,没有人类明显的模式。
然而,通过一些计算,你可以很容易地发现如果你只是用一个连续的数字序列代替 会有一些问题。在那个公式中(这就是你所做的)。 rand()
的每次调用之间的差异将恰好等于 , 除非 实际上接近 RAND_MAX
。
通过rand()
函数获取随机数的正确方法是一开始只调用一次srand()
,并且只使用rand()
在循环中。
或者,您可以寻找许多其他随机生成公式,您可能可以在这里找到一些:How to generate a random int in C?
关于clang - 糟糕的 rand() 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64619808/
我想在这里说的是我在从之前离开的相同状态重新启动我的应用程序时遇到的问题。我在这方面做了很多研发,并且已经解决了 stackoverflow 中发布的问题。所以请不要说它是重复的。 我试过设置这些选项
当我在我的类中实现 __cmp__ 函数时,python 是否会在内部重载“==”,我们在 C++ 中是如何做到的? 只是好奇。我是 python 的新手。 :) 最佳答案 ==的含义当您定义 __c
我在 Raspberry Pi2 上安装了 Gitlab,几个月来它运行良好。但自从关闭了RPi的电源后,它就不再起作用了。网页返回502错误。 502 Whoops, GitLab is takin
有人知道用户登陆带有Webfonts的页面时为什么Google Chrome浏览器崩溃吗 它并不会一直发生,而是经常发生 我刚得到一个蓝屏页面,却不知道为什么:该页面不是来自重定向时就很好了。 这是我
当我登录时,Skype始终会给出此错误。 糟糕,Skype存在问题。尝试注销然后重新登录。 STARTUP_LOAD_ERROR MACBOOK 最佳答案 Macbook 用户 退出Skype 回家
我正在尝试从 flutter 开始,首先我在 cmd 上运行 flutter doctor 它有效。在我安装了 ANDROID SDK 之后,同样的命令 flutter doctor 给了我异常:
从 android studio 终端运行 flutter attach 不工作。显示错误flutter 意外退出。 终端输出: flutter attach Checking for adverti
当使用 TinyMCE 4 测试所有浏览器时,Chrome 非常慢。 (我尝试从 TinyMCE 中删除所有插件,但没有任何区别。) Chrome 需要大约 20-25 秒在 TinyMCE 中呈现一
我试图让下面的脚本工作,以便从远程服务器(服务器 1)读取特定目录中的 CSV 文件列表,并将数据移植到另一台服务器的 PostgreSQL 数据库中。 我已经创建了一个 rsa SSH key 并将
在嵌入式 linux 环境中(在 PowerPC 上定制的 2.4.25)几个小时后我得到以下内核 panic : Oops: kernel access of bad area, sig: 11 N
在将现有 Node.js (Hapi.js) + RethinkDB 从 OVH VPS(最小 vps)迁移到 AWS Lambda( Node )+ DynamoDB 的过程中,我最近遇到了一个非常
我是一名优秀的程序员,十分优秀!