最近写代码,做算法。反正每年都会有几个月在写算法,可能局部算法目标完全相同,但看待代码设计的角度和感觉不同。以前挺不以为然状态机的。 状态机无非: while个大循环, swtich case 判状态,每个入口完毕后,刷新状态。一切就OK了。 这两天写了个归并算法,又思考了一下,算法设计本身的问题。不是所要面对的算法目标本身。 其实算法的逻辑组合也是个状态机。具体怎么抽象出来,得出的结论,我就不描述了,算是方法论,还是那句,看得懂的,都懂,我是废话,看不懂的,还是不懂,要么以后悟出来了,要么类似问题就是无力解决。 只想说,程序设计,要两个坚持。 1、多动手,不沉下去写,无法对思考方法给予反馈,并总结。这里说的是相同目标。隔段时间重写一遍,而不是每天忙忙碌碌的应付不同业务。 2、多思考,其实相同的事情,不同的层次和角度会有不同的思考模式以及抽象后的结论。即便每年对同样一个设计目标重复处理。也会得出不同的结论。而这些结论的影响力(对其他算法的类似设计思维方式),是不同的。 上述两个是辩证的, 仅思考,不动手,没有问题反馈,没有实践经验,那只是空想。 没有思考,只是动手,重复同样的设计目标,那还不如去外包公司,多少还可以 码完代码换烟钱。
有一个函数随机生成 0, 或者 1,产生的结果是不平均。 如何产生平均的随机数 0,1
######
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。 ######
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; }我的思想就是不停刷状态。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。