大佬教程收集整理的这篇文章主要介绍了18万亿投掷硬币,我哪里出错了?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
它在18万亿投币中找到了行序列中最长的同一侧. [见Iain m. Banks的科幻小说考虑Phlebas.]
在服务器上,经过15.7万亿投币(它仍然在运行)之后,到目前为止,行序列中最长的同一侧只有29个.由于2 ^ 44 = 17,592,186,044,416,我希望最长的相同边序列在某个地方. 40到40年代中期,在完成所有18万亿之后可能达到44.
在仅仅47亿次投掷硬币之后的桌面上,最长的序列已经是31,因为2 ^ 31 = 2,147,483,648,这听起来是正确的.
那么为什么我在15.7万亿投币后只在服务器上获得了29个序列,但在我的桌面上只有47亿的31个序列?
@H_926_5@modulo偏见是我的第一个想法.桌面和服务器上的RAND_MAx是相同的,2,647(32位长签名).所以rand()函数会给我一个数字0< = rand()< = 2,647. 0是偶数,647是奇数,所以除非我非常误以为我的int引入了模偏差rand_num =(rand()%2);代码行. 我知道C标准库的伪随机数生成器不适合加密.当然,这不可能是一个因素,当然产生非常长,零和一系列的序列.可以吗? 这是来源: 使用以下两种机器编译:gcc -O3 -o 18TCT 18TrillionCoinTosses.c#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc,char* argv[]) { srand(time(NULL)); int current_seq = 0; int longest_seq = 0; int prev_rand_num = -1; long long i = 0; long long @R_284_10586@l = 18000000000000; // To serve as a rudimentary progress inDicator. long billion_counter = 0; long billion = 1000000000; while (i < @R_284_10586@l) { int rand_num = (rand() % 2); if (rand_num == prev_rand_num) { current_seq++; if (current_seq >= longest_seq) { longest_seq = current_seq; printf("Longest sequence so far: %d (on iteration %lli)\n",longest_seq,i); } } else current_seq = 1; if (billion_counter == billion) { billion_counter = 0; printf("Progress report,current iteration: %lli\n",i); } prev_rand_num = rand_num; i++; billion_counter++; } printf("\n@R_284_10586@l coins tossed: %lli\n",i); printf("Longest sequence: %d\n",longest_seq); }@H_801_17@
另外,作为一个侧面点,rand()%2是有风险的,虽然现在大多数RNG没有会把你烧到那里的问题(如果你确实有这个问题,你就会知道它,因为除其他外无论如何,你都会连续获得0分.
以上是大佬教程为你收集整理的18万亿投掷硬币,我哪里出错了?全部内容,希望文章能够帮你解决18万亿投掷硬币,我哪里出错了?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。