[问题] C++ 乱数产生

楼主: yangmeme (MeMe)   2014-04-23 20:09:50
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Dev-C++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
No
问题(Question):
设定一半径为500的圆,随机产生一点于圆内并算出与圆点的距离
现在有个问题就是,我的x1产生出来的值,没有办法像y1这么的随机
喂入的资料(Input):
No
预期的正确结果(Expected Output):
x1:-500~500的值,y1:-500~500的值
错误结果(Wrong Output):
x1感觉有固定的顺序,Ex:-433,-427,-420
程式码(Code):(请善用置底文网页, 记得排版)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
main()
{
int x1,y1;
float r1;
srand(time(NULL));
x1=(rand()%1000)-500;
y1=(rand()%1000)-500;
r1=sqrt(x1*x1+y1*y1);
if(r1<=500)
{
printf("x1 = %d\n",x1);
printf("y1 = %d\n",y1);
printf("r1 = %lf\n",r1);
}
else
{
printf("x1 = %d\n",x1);
printf("y1 = %d\n",y1);
printf("r1 is error\nr1 is %lf\n",r1);
}
}
补充说明(Supplement):
No
作者: azureblaze (AzureBlaze)   2014-04-23 21:15:00
你测了多少次?不够随机是多不够随机?你乱数的取法有些瑕疵但是我相信和你的问题无关
楼主: yangmeme (MeMe)   2014-04-23 21:36:00
不够随机的意思就是,值的范围都很接近不好意思问,乱数的取法有瑕疵,是哪里有瑕疵
作者: azureblaze (AzureBlaze)   2014-04-23 21:42:00
你抽了三次就觉得都很接近吗?
楼主: yangmeme (MeMe)   2014-04-23 21:55:00
http://ppt.cc/zcqM 执行5次结果
作者: LPH66 (-6.2598534e+18f)   2014-04-23 22:59:00
治标: 在取值给 x1 前先取几次乱数丢掉治本: 想清楚你的“多取几次”是否适合用循环执行这其实是另一种型式的“在过近的时间内 srand(time(NULL))”
作者: BlazarArc (Midnight Sun)   2014-04-23 23:06:00
google了一下的确有人提到 rand first call 这问题
作者: azureblaze (AzureBlaze)   2014-04-23 23:59:00
我记得devcpp的srand很烂 把前面的乱数先抽掉再用他srand之后第一个rand会和seed成线性关系所以srand(time)会变成照秒数跑更治本的方式是把devcpp丢掉
作者: LPH66 (-6.2598534e+18f)   2014-04-24 01:16:00
只要是 LCG 都是这样吧...
作者: azureblaze (AzureBlaze)   2014-04-24 02:12:00
一般的LCG不会糟到第一个数用表就可以预测...
作者: LPH66 (-6.2598534e+18f)   2014-04-24 10:20:00
再糟也不会比 16807 糟吧...又不是多旧的东西(虽然我没看过)
作者: snaketsai (さいでんし)   2014-04-24 20:08:00
azureblaze:你是说它包的mingw吗= =?不然就用 mt19937 : http://p.tl/OQ1z
作者: yvb   2014-04-25 00:22:00
基本上 Dev-C++ 用了 MinGW, 就是用 MS-Windows 的 C-RuntimeDLLs,其中主要就是 MSVCRT.DLL (Microsoft C runtime library)而MSVC的 rand() 实作大概就是seed=seed*0x343fd+0x269EC3; return (seed>>0x10)&0x7FFF;因为 return 时做了 right-shift, 而 seed 的乘数不够大,所以造成srand()用相近的seed,第一次rand()会得到相近的值.
作者: snaketsai (さいでんし)   2014-04-26 18:29:00
w64有搬了一些Runtime,不过就算是那样,问题点也是在MSVCRT,而不是DevCPP这个〝IDE〞上面吧@@

Links booklink

Contact Us: admin [ a t ] ucptt.com