#!/usr/bin/env python # http://svn.red-bean.com/repos/kfogel/trunk/bin/diamond-detector # This code is in the public domain. -Karl Fogel # See http://www.firstthings.com/article/2016/05/scientific-regress # for a description of the thought experiment that this implements. import sys import getopt import random def sniff(stone): "Return True if STONE contains a diamond, else False, with 99% accuracy." if random.randint(1,100) != 42: return stone else: return not stone def scan_until_first_alarm(stones): "Return True if the first alarm raised is accurate, else return False." while True: for i in range(0, len(stones)): if sniff(stones[i]): if stones[i]: return True else: return False def main(): accurate_alarms = 0 inaccurate_alarms = 0 if len(sys.argv) == 1: sys.stderr.write("Usage: %s NUM_ITERATIONS\n" % sys.argv[0]) sys.exit(1) iterations = int(sys.argv[1]) for i in range(0, iterations): stones = [False] * 101 # Place a diamond inside a random stone: stones[random.randint(0, len(stones) - 1)] = True # Walk around the field, trying out the detector: if scan_until_first_alarm(stones): accurate_alarms += 1 else: inaccurate_alarms += 1 assert accurate_alarms + inaccurate_alarms == iterations print "%d (%.1f%%) accurate alarms, %d (%.1f%%) inaccurate alarms" \ % (accurate_alarms, (float(accurate_alarms) / float(iterations)) * 100, inaccurate_alarms, (float(inaccurate_alarms) / float(iterations)) * 100) if __name__ == '__main__': main()