关于系列
首先,您可以像对待其他任何代码高尔夫挑战赛一样对待它,并回答它而不必担心系列赛。但是,在所有挑战中都有排行榜。您可以在第一篇文章中找到排行榜以及有关该系列的更多信息。
尽管我在本系列中有很多想法,但未来的挑战还没有定下来。如果您有任何建议,请在相关的沙箱帖子上让我知道。
第4洞:贝特朗悖论
该贝特朗悖论是一个有趣的问题,它显示了在一个圆圈采摘随机和弦可以产生和弦,它们的中点和它们的长度的不同分布如何不同的方法。
在这一挑战中,您应该使用“右”方法生成单位圆的随机和弦,即产生在分布和平移下不变的和弦分布的方法。在链接的Wikipedia文章中,“方法2”就是这样的方法。
确切的规则如下:
- 您应该使用一个正整数
N
,该整数指定应返回多少个和弦。输出应该是一个N
和弦列表,每个和弦都指定为单位圆上的两个点,以其弧度的极角表示。 - 您的代码应该能够为两个角度中的每个角度至少返回2 20个不同的值。如果可用的RNG范围较小,则必须首先在内置的RNG之上构建具有足够大范围的RNG,或者必须实现自己合适的RNG。此页面可能对此有所帮助。
- 和弦的分布必须与链接的Wikipedia文章中“方法2”产生的和弦没有区别。如果您采用其他算法来选择和弦,请提供正确性证明。无论您选择实施哪种算法,从理论上讲,它都必须能够在单位圆中生成任何有效的和弦(不包括基础PRNG或有限精度数据类型的限制)。
- 您的实现应使用并返回浮点数(至少32位宽)或定点数(至少24位宽),并且所有算术运算都应在16 ulp以内准确。
您可以编写完整的程序或函数,并通过STDIN(或最接近的替代方案),命令行自变量或函数自变量接受输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数产生输出。
输出可以采用任何方便的列表或字符串格式,只要可以清楚地区分各个数字并且它们的总数始终为偶数即可。
这是代码高尔夫球,因此最短的提交(以字节为单位)获胜。当然,每位用户最短的提交时间也将进入该系列的整体排行榜。
可视化
您可以使用以下代码段渲染生成的线并检查其分布。只需将成对的角度列表粘贴到文本区域即可。该代码段应该能够处理几乎所有列表格式,只要这些数字是简单的十进制数字(无科学计数法)即可。我建议您至少使用1000行来了解分布情况。我还提供了以下文章中介绍的不同方法的一些示例数据。
排行榜
为确保您的答案显示出来,请使用以下Markdown模板以标题开头每个答案:
# Language Name, N bytes
N
您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数来保持标题。例如:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(目前未显示该语言,但是该代码段确实需要并对其进行解析,并且将来我可能会添加一个语言排行榜。)