Mathematica, 42 40 39 ไบต์ (หรือ 31/29?)
ฉันมีสามโซลูชั่นทั้งหมดที่ 42 ไบต์:
4Count[1~RandomReal~{#,2},p_/;Norm@p<1]/#&
4Tr@Ceiling[1-Norm/@1~RandomReal~{#,2}]/#&
4Tr@Round[1.5-Norm/@1~RandomReal~{#,2}]/#&
พวกมันเป็นฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนตัวอย่างn
และส่งกลับค่าประมาณ ational ก่อนอื่นพวกเขาสร้างn
คะแนนในหน่วยสี่เหลี่ยมในจตุภาคบวก 4
แล้วพวกเขาก็กำหนดจำนวนของกลุ่มตัวอย่างผู้ที่อยู่ภายในวงกลมหน่วยและแล้วพวกเขาก็หารด้วยจำนวนตัวอย่างและคูณด้วย ความแตกต่างเพียงอย่างเดียวคือวิธีที่พวกเขากำหนดจำนวนตัวอย่างภายในวงกลมหน่วย:
- คนแรกที่ใช้โดยมีเงื่อนไขว่า
Count
Norm[p] < 1
- หนึ่งที่สองลบบรรทัดฐานของแต่ละจุดจาก
1
นั้นปัดขึ้น นี้จะเปลี่ยนหมายเลขภายในวงกลมหน่วยที่และภายนอกเหล่านั้นไป1
หลังจากนั้นผมก็เพียงแค่รวมพวกเขาทั้งหมดขึ้นกับ0
Tr
- หนึ่งในสามจะเป็นหลักเดียวกัน แต่หักจาก
1.5
ดังนั้นฉันสามารถใช้แทนRound
Ceiling
เอาเป็นว่าในขณะที่เขียนบทความนี้เกิดขึ้นกับฉันว่ามีวิธีแก้ปัญหาที่สั้นกว่าถ้าฉันลบจาก2
นั้นก็ใช้Floor
:
4Tr@Floor[2-Norm/@1~RandomReal~{#,2}]/#&
หรือบันทึกไบต์อื่นโดยใช้ Unicode floor หรือเพดานโอเปอเรเตอร์:
4Tr@⌊2-Norm/@1~RandomReal~{#,2}⌋/#&
4Tr@⌈1-Norm/@1~RandomReal~{#,2}⌉/#&
โปรดทราบว่าโซลูชันที่ใช้การปัดเศษสามตัวยังสามารถเขียนด้วยMean
แทนที่จะเป็นTr
และไม่มี/#
อีกครั้งสำหรับไบต์เดียวกัน
หากวิธีการพื้นฐานอื่น ๆ ของ Monte Carlo นั้นดี (โดยเฉพาะอย่างยิ่งปีเตอร์ที่ได้เลือกไว้) ฉันสามารถทำได้ 31 ไบต์โดยประมาณอินทิกรัลของหรือ 29 โดยใช้อินทิกรัลของเวลานี้ให้เป็นจำนวนจุดลอยตัว:√(1-x2)
1/(1+x2)
4Mean@Sqrt[1-1~RandomReal~#^2]&
Mean[4/(1+1~RandomReal~#^2)]&