开发者社区> 问答> 正文

状态机,曾经认为没有内涵,最近又思考了思考。。 热:报错

最近写代码,做算法。反正每年都会有几个月在写算法,可能局部算法目标完全相同,但看待代码设计的角度和感觉不同。以前挺不以为然状态机的。 状态机无非: while个大循环, swtich case 判状态,每个入口完毕后,刷新状态。一切就OK了。 这两天写了个归并算法,又思考了一下,算法设计本身的问题。不是所要面对的算法目标本身。 其实算法的逻辑组合也是个状态机。具体怎么抽象出来,得出的结论,我就不描述了,算是方法论,还是那句,看得懂的,都懂,我是废话,看不懂的,还是不懂,要么以后悟出来了,要么类似问题就是无力解决。 只想说,程序设计,要两个坚持。 1、多动手,不沉下去写,无法对思考方法给予反馈,并总结。这里说的是相同目标。隔段时间重写一遍,而不是每天忙忙碌碌的应付不同业务。 2、多思考,其实相同的事情,不同的层次和角度会有不同的思考模式以及抽象后的结论。即便每年对同样一个设计目标重复处理。也会得出不同的结论。而这些结论的影响力(对其他算法的类似设计思维方式),是不同的。 上述两个是辩证的, 仅思考,不动手,没有问题反馈,没有实践经验,那只是空想。 没有思考,只是动手,重复同样的设计目标,那还不如去外包公司,多少还可以 码完代码换烟钱。

展开
收起
kun坤 2020-06-09 11:50:52 417 0
1 条回答
写回答
取消 提交回答
  • 有一个函数随机生成 0, 或者 1,产生的结果是不平均。 如何产生平均的随机数 0,1  

    ######

    引用来自“看能不能改个名”的答案

    有一个函数随机生成 0, 或者 1,产生的结果是不平均。 如何产生平均的随机数 0,1  
    多叠几个delay,然后反馈。和信号处理是一样的。哈。说人话。。 加个BUF(循环队列),然后当BUF满时,才能考虑输出。输出是对BUF中,0,1的情况汇总。最简单的方法如下,32个存储位置。
    unsigned int buf = 0;
    unsigned int count = 0;
    void input_rand(int flag){ //0 or 1
        buf = (buf << 1) + (flag!=0);
        count += (count < 32);
    }
    
    float get_rand(void){
        if (count < 32) return -1; // not rand
        return 1 / ((float)(buf) + 1);
    }
    如果你无所谓前32个的随机性,那么上面设计count的代码可以全部去掉。 ######怪我没把问题描述清楚。 问题是, 有一个不平均的随机数生成器,可以生成 0 或者 1, 如何利用这个不平均的随机数生成器生成 平均的随机数 0 或者 1。 ######

    引用来自“看能不能改个名”的答案

    怪我没把问题描述清楚。 问题是, 有一个不平均的随机数生成器,可以生成 0 或者 1, 如何利用这个不平均的随机数生成器生成 平均的随机数 0 或者 1。 
    是说的期望不为0.5的问题吗?如果是这个问题,仍然是做数据累积。获取已有期望和0.5的比例,反过来修正当前的值。 ######

    引用来自“中山野鬼”的答案

    引用来自“看能不能改个名”的答案

    怪我没把问题描述清楚。 问题是, 有一个不平均的随机数生成器,可以生成 0 或者 1, 如何利用这个不平均的随机数生成器生成 平均的随机数 0 或者 1。 
    是说的期望不为0.5的问题吗?如果是这个问题,仍然是做数据累积。获取已有期望和0.5的比例,反过来修正当前的值。
    没看懂你的思路。 不过我觉得 类似的问题很对应你帖子的主题。就是状态机制, 循环,检测,刷状态。   ######

    引用来自“看能不能改个名”的答案

    引用来自“中山野鬼”的答案

    引用来自“看能不能改个名”的答案

    怪我没把问题描述清楚。 问题是, 有一个不平均的随机数生成器,可以生成 0 或者 1, 如何利用这个不平均的随机数生成器生成 平均的随机数 0 或者 1。 
    是说的期望不为0.5的问题吗?如果是这个问题,仍然是做数据累积。获取已有期望和0.5的比例,反过来修正当前的值。
    没看懂你的思路。 不过我觉得 类似的问题很对应你帖子的主题。就是状态机制, 循环,检测,刷状态。  
    关键是,你所谓的不平均是否就是说随机数的期望不是0.5。 ######不平均,期望值不是0.5  ,希望获得 期望值 是0.5的随机数。 ######我的思路。
    int m_rand(); /* 不平均产生0 或者 1 */
    
    int r_rand() {
      int f; /* 状态 */
      int t; /* 临时量 */
    
      t = m_rand(); /* 获取一次 */
      f = t; /* 状态初始化为第一次获取结果 */
      while(t == m_rand()) {
        /* 再次获取结果与上次相同,刷状态 */
        f = f^1;
      }
     return f;
    }
    我的思想就是不停刷状态。 ######

    引用来自“看能不能改个名”的答案

    我的思路。
    int m_rand(); /* 不平均产生0 或者 1 */
    
    int r_rand() {
      int f; /* 状态 */
      int t; /* 临时量 */
    
      t = m_rand(); /* 获取一次 */
      f = t; /* 状态初始化为第一次获取结果 */
      while(t == m_rand()) {
        /* 再次获取结果与上次相同,刷状态 */
        f = f^1;
      }
     return f;
    }
    我的思想就是不停刷状态。
    你这个不能保证平均啊。你的代码等价于,对bitstreams,判断连续1,或0的个数的奇偶性。跑出来的概率是bitstreams的个数奇偶性的概率。我没觉得这个可以保证平均产生0或者1。 除非m_rand的存在上述奇偶性的概率属于平均分布,否则还是不平均。哈。 ######是不是真的啊。 我去测试下。我觉得这样能保证结果期望值是0.5######果然,这样产生的随机数是不平均的。 具体论证是由于产生是不平均的,那么连续数中概率和 不平均概率比例有关系。 连续概率中奇偶比例总体就不平均了。需要改进啊。
    2020-06-09 11:51:04
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
典型业务逻辑漏洞挖掘 立即下载
《前端智能化实践》——逻辑代码生成 立即下载