免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 发仔很忙
打印 上一主题 下一主题

[算法] 如何实现返回0和1的概率为50% [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-10-25 11:35 |只看该作者
10L的确有问题,28L终于找出原因,我想的时候也考虑这个,10L不行
运行foo()5次。。。。 ans == 2 就是要出现3个0,2个1,就是 0.6^3 * 0.4^2
然后总共的可能情况有 nchoosek( 5 , 3 );
所以 ans == 2 的概率应该是所有情况概率相加,也就是nchoosek( 5 , 3 ) * 0.6^3 * 0.4^2 跟28L一样了。。。 =0.3456

现在要考虑有没有解的问题了。。。如果抛弃一些样本点,就会出现不收敛的情况,只能只有很少的概率会一直死循环。。。但是有些应用不能依靠概率,察。。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
32 [报告]
发表于 2012-10-25 11:50 |只看该作者
回复 10# hellioncu


    思路完全正确,只是等号用的不合适。

论坛徽章:
0
33 [报告]
发表于 2012-10-25 12:22 |只看该作者
本帖最后由 hbmhalley 于 2012-10-25 12:23 编辑

回复 27# bruceteen


    lim sigma_(i=0~n){(0.6^2+0.4^2)^i * (0.4*0.6)} = 0.5

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
34 [报告]
发表于 2012-10-25 13:01 |只看该作者
对于确定性的算法,算不出50%,就如同用尺规无法三等份角。
那么就只好用不确定性的手段
比如
在连续两次取随机得到01或者10的时候找01出现的概率

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
35 [报告]
发表于 2012-10-25 13:02 |只看该作者
hbmhalley 发表于 2012-10-25 12:22
回复 27# bruceteen

佩服,我数学没你那么好,看不懂
但“极限”的意思就是永远达不到^_^

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
36 [报告]
发表于 2012-10-25 13:11 |只看该作者
cjaizss 发表于 2012-10-25 13:01
对于确定性的算法,算不出50%,就如同用尺规无法三等份角。
那么就只好用不确定性的手段
比如

其实本质上和无法三等份角一样的,就是无法用有限的组合搭建出50%
举个更加简单的例子,
在自然数
+,-
/10
三种运算的环境里无法表示1/3

论坛徽章:
1
射手座
日期:2014-08-04 16:49:43
37 [报告]
发表于 2012-10-25 13:46 |只看该作者
本帖最后由 hanzhenlll 于 2012-10-25 13:54 编辑
  1. #include <stdio.h>

  2. #define LEN 10
  3. int m_rand[LEN] = {0};

  4. void clear_arry ()
  5. {
  6.         int i;

  7.         for (i = 0; i < LEN; i++)
  8.         {
  9.                 m_rand[i] = 10;
  10.         }

  11. }
  12. void write_num (int num)
  13. {
  14.         int i;

  15.        
  16.         if (num == 1)
  17.         {
  18.                 for (i = 0; i < LEN; i++)
  19.                 {
  20.                         if (m_rand[i] != num)
  21.                         {
  22.                                 m_rand[i] = num;
  23.                                 break;
  24.                         }
  25.                 }
  26.         }
  27.         else if (num == 0)
  28.         {
  29.                 for (i = LEN; i > 0; i--)
  30.                 {
  31.                         if (m_rand[i] != num)
  32.                         {
  33.                                 m_rand[i] = num;
  34.                                 break;
  35.                         }
  36.                 }
  37.                
  38.         }
  39. }

  40. void get_num (int *rand_60_num, int *rand_40_num)
  41. {
  42.         int i;
  43.         for (i = 0; i < LEN; i++)
  44.         {
  45.                 if (m_rand[i] == 1)
  46.                         *rand_60_num = *rand_60_num + 1;
  47.                 else if (m_rand[i] == 0)

  48.                         *rand_40_num = *rand_40_num + 1;
  49.         }
  50.        
  51. }

  52. int  foo ()
  53. {
  54.         int n = 0;
  55.        
  56. //        printf ("n-------=-===============>%x\n", &n);
  57.         int rand_60_num = 0, rand_40_num = 0;

  58.         if ((int)&n & 0x10)
  59.         {
  60.                         get_num (&rand_60_num, &rand_40_num);
  61.                         if (rand_60_num < 6)
  62.                         {
  63.                                 write_num (1);
  64.                                 return 1;
  65.                         }
  66.                         else if (rand_40_num < 4)
  67.                         {
  68.                                 write_num (0);
  69.                                 return 0;
  70.                         }
  71.                         else if ((rand_60_num == 6) && (rand_40_num == 4))
  72.                         {
  73.                                 clear_arry();
  74.                                 write_num (1);
  75.                                 return 1;
  76.                         }
  77.                        
  78.         }
  79.         else
  80.         {
  81.                         get_num (&rand_60_num, &rand_40_num);
  82.                         if (rand_40_num++ < 4)
  83.                         {
  84.                                 write_num (0);
  85.                                 return 0;
  86.                         }
  87.                         else if (rand_60_num++ < 6)
  88.                         {
  89.                                 write_num (1);
  90.                                 return 1;
  91.                         }
  92.                         else if ((rand_60_num == 6) && (rand_40_num == 4))
  93.                         {
  94.                                 clear_arry();
  95.                                 write_num (0);
  96.                                 return 0;
  97.                         }
  98.                
  99.         }
  100.        
  101.        
  102.                
  103. }
  104. int main (int argc, char *argv[])
  105. {
  106.         int n = 2, i = 0, j = 1;
  107.        
  108.         clear_arry ();
  109.         for (j = 1; j < 10; j++)
  110.         {
  111.         for (i = 0; i < 10; i++)
  112.         {
  113.                 n = foo ();
  114.                 printf ("n--->[%d]\n", n);
  115.         }
  116.                 sleep (j);
  117.         }

  118.         return 0;
  119. }
复制代码
如果我要去面试 肯定是过不了了..... ,每次栈地址都不同,所以拿这个开刀,求值..按比例填入0 , 1值,  从算法的角度基本就是废柴,如果只是实现的话 应该也能算个凑合的方法...

论坛徽章:
0
38 [报告]
发表于 2012-10-25 17:57 |只看该作者
回复 35# bruceteen


    啊 .. 这里的意思是 2n 次调用(遇01/10则停)以内获得 01 的概率,有限次内确实是不到 0.5 的
    但如果不限次数,则是等于 0.5 的。
    而获得非 01/10 的概率随调用次数是呈指数下降的
    有个形象的比喻,这种指数下降的概率两位数次方以后,是小于宇宙射线改变改变内存存储状态的概率的,因而可以忽略。
    所谓“永远不是” 也只是理论上的可能而已。

论坛徽章:
0
39 [报告]
发表于 2012-10-29 13:14 |只看该作者
我有一个想法,不知道对不对。我是这样想的:假设我们要生成N个随机数,先用foo()生成并保存在a[N]中,那么数组a中0占60%,1占40%(N足够大),然后把60%中的10%由0变成1,这样0和1就各占一半。

论坛徽章:
0
40 [报告]
发表于 2012-10-29 20:29 来自手机 |只看该作者
感觉求(6/10)∧x+(4/10)∧y=1/2
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP