找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 11043|回复: 8

关于EV3随机模块的问题

  [复制链接]
发表于 2018-3-20 14:10:42 | 显示全部楼层 |阅读模式
之前做有关随机的程序时,总觉得某个值会出现的概率比较大,我学的是统计学,一开始认为这是偶然事件,样本容量不够大导致的但是前几天又做了一个随机相关的程序,又发现了这样一个情况,所以回到家做了一个程序来验证。
程序随机抓取1/2/3中的一个数字,并计算出现1/2/3的次数之比。
下面第一列为每次1000个数据,连续20次,每次不重新计算的结果。
第二列为每次10000个数据,连续20次,每次重新计算的结果。
出现的是比例约等于1:2:1
那么出现这种比例的情况是为什么呢?

微信图片_20180320141005.jpg
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2018-3-20 15:11:55 | 显示全部楼层
没什么情况,ev3-g的bug而已。
像你这样在3个数字中随机取值,1和3出现的概率加起来与2相同;如果在1,2,3,4中随机取值,则2和3出现的概率为1/3,1和4出现的概率合起来为1/3。以此类推。
很欣赏你的探究精神,给你点赞!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复 1 0

使用道具 举报

发表于 2018-3-20 21:00:13 | 显示全部楼层
barzz 发表于 2018-3-20 15:11
没什么情况,ev3-g的bug而已。
像你这样在3个数字中随机取值,1和3出现的概率加起来与2相同;如果在1,2,3, ...

学习了,那为求公平就应该把两端的数字算一个了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-3-21 10:54:12 | 显示全部楼层
EV3  喜欢2       因为它工作的时候总是010101的 很难数到2 所以能用的时候多用用
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-3-21 12:30:17 | 显示全部楼层
这个问题之前遇到过,猜想可能是随机的是小数四舍五入的原因
MIN=1,MAX=3,假设精确到0.1
那么1的概率范围1~1.4,2的概率范围1.5~2.4,3的概率范围2.5~3。
所以1和3出现的概率是2的一半,其他情况同理。
结局方法是让MIN=0.5,MAX=3.4,感觉会好一点,
但仅为猜想,没有大量数据验证。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-3-23 10:03:44 | 显示全部楼层
lsm910817 发表于 2018-3-21 12:30
这个问题之前遇到过,猜想可能是随机的是小数四舍五入的原因
MIN=1,MAX=3,假设精确到0.1
那么1的概率范 ...

感觉好有道理
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-7-4 17:50:27 | 显示全部楼层
下面是EV3随机模块调用函数的源代码。
void      Random(void)
{
  DATA16  Min;
  DATA16  Max;
  DATA16  Result;

  Min     =  *(DATA16*)PrimParPointer();
  Max     =  *(DATA16*)PrimParPointer();

  Result  =  (DATA16)rand();

  if (Result < 0)
  {
    Result  =  0 - Result;
  }

  Result  =  (((Result * (Max - Min)) + 16383) / 32767);
  Result +=  Min;

  *(DATA16*)PrimParPointer()  =  Result;
}
Random这个函数最终也是调用的C语言的库函数,rand()。我们都知道rand()函数会从0~32767里面随机选出一个数。

重点看这一步。
Result  =  (((Result * (Max - Min)) + 16383) / 32767);
  Result +=  Min;


如题主所说,我们想从1~3里面随机取数。 即max = 3, min = 1, max - min = 2
假设随机函数rand()的返回值是 a;而我们最终获得的返回值是b。
由源代码可知
式①   (a*2+16383)/32767  + 1 = b
注意其中的斜杠算符'/‘是整除符号。 比如 10/3=3,余数直接略掉。
由式① 可以求出

b = 1时,  0<= a <= 8191
b = 2时,  8192<= a <= 24575
b = 3 时, 24576<= a <= 32767

尽管rand()函数是伪随机函数,但是基本可以认为是均匀分布。可以计算出 b的概率分布如下:

b = 1    25%
b = 2    50%
b = 3    25%。

嗯,根本就不是均匀分布,不知道乐高开发人员为什么要这么写。

实际上,如果假设  max = n,  min = 1; 那么b的概率函数P(b)将有如下规律

P(b=1) =  P(b=n) = 1/((n-1)*2)
P (b=其他值) = 1/(n-1)








如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2019-11-7 10:48:31 | 显示全部楼层
怎么让里面随机的数值把这个随机的结果,随机一次就结束。就比如1,2,3,4,5,6,随机到1做出一些动作以后一以后就舍去,就再也不随机一,怎么搞?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2019-12-26 14:59:49 | 显示全部楼层
wo85325432 发表于 2019-11-7 10:48
怎么让里面随机的数值把这个随机的结果,随机一次就结束。就比如1,2,3,4,5,6,随机到1做出一些动作以 ...

同问
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-22 13:56 , Processed in 0.090351 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表