ความน่าจะเป็น 1 / N


29

เนื่องจากมีความท้าทายของไม่เพียงพอ:

สร้างโปรแกรมหรือฟังก์ชั่นที่ไม่มีชื่อตัวเลือกที่กำหนด (โดยวิธีการใด ๆ ) จำนวนเต็ม 1 output N ≤ 10000 ส่งออกค่า True ของภาษาของคุณด้วยความน่าจะเป็นแบบหลอกเทียมที่ 1 / N, False มิฉะนั้น

โปรดทราบว่าข้อกำหนดสำหรับการตั้งชื่อถูกลบแล้ว รู้สึกอิสระที่จะแก้ไขคำตอบและคะแนนตาม

บางภาษาใช้ 1 (หรือ -1) และ 0 สำหรับจริงและเท็จซึ่งก็ใช้ได้เช่นกัน

ตัวอย่าง:

ตัวอย่างการทดสอบอินพุต:

4 -> True
4 -> False
4 -> False
4 -> False
4 -> False
4 -> True
4 -> False
4 -> False

เช่นให้ 4; มันจะคืนความจริงด้วยโอกาส 25% และเท็จพร้อมโอกาส 75%



1
นอกจากนี้ยังโพสต์เมตาที่เกี่ยวข้อง
AdmBorkBork

ไม่ใช่ทุกภาษาที่สร้างขึ้นด้วย "การหลอกความเป็นผู้ใหญ่" เป็นไปได้ไหมที่จะรับเมล็ดเป็นอาร์กิวเมนต์ที่สอง? (เช่น Brainfuck)
ข้อบกพร่อง

@flawr ใช้มิลลิวินาทีปัจจุบัน ...
อดัม

1
อะไรที่ใหญ่ที่สุดที่Nเราต้องยอมรับ
Toby Speight

คำตอบ:


27

เทมเพลต MediaWiki ที่มีParserFunctionsขนาด 48 ไบต์

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}

13
ทางเลือกที่น่าสนใจของภาษา :-)
อดัม

6
ใครที่คิดว่ามันจะเหมาะสมที่จะเพิ่มฟังก์ชั่นที่ไม่ได้กำหนดไว้ในแม่แบบ MediaWiki!?
user253751

4
@immibis: ดีไม่ใช่ระดับเกิดขึ้นจาก#timeอาจจะปรับปรุงอายุของผู้คนที่มีชีวิตอยู่ ฯลฯ
วิลเล็มแวน Onsem

15

Pyth, 3 ไบต์

!OQ

ลองออนไลน์

การผกผันอย่างง่ายของตัวเลือกแบบสุ่มจาก 0 ถึงอินพุต

ด้วยความสนุกสนานใน Pyth มันเป็นไปไม่ได้ที่จะสร้างฟังก์ชั่นที่ทำสิ่งนี้โดยไม่ได้$เพราะฟังก์ชั่น Pyth นั้นจะถูกบันทึกโดยอัตโนมัติ



@LeakyNun Ah ใช่ฉันลืมเกี่ยวกับการใช้เวลาสำหรับฟังก์ชั่นการสุ่มซึ่งค่อนข้างฉลาด
FryAmTheEggman

ไม่ฉันเพิ่งใช้เวลาในการยกเลิกการบันทึก
Leun Nun

1
ฉันรู้ฉันเดาว่าฉันไม่ได้พูดออกมาได้ดี: P นั่นบอกว่าฉันไม่คิดว่ามันจะเป็นวิธีแก้ปัญหาสำหรับการส่งส่วนใหญ่จริง ๆ ถ้ามันดีกว่าโปรแกรมเต็มรูปแบบด้วยเหตุผลบางอย่าง การสละเวลาเป็นอาร์กิวเมนต์อาจไม่ได้รับอนุญาตโดยค่าเริ่มต้น
FryAmTheEggman

1
@LeakyNun ฉันเชื่อว่าคำถามนี้มีมาก่อนในการQกรอกในตอนท้ายเป็นอย่างอื่นฉันจะได้ตอบ!O;)
FryAmTheEggman

12

CJam, 5 ไบต์

ต้องรวดเร็วกับสิ่งเหล่านี้ ...

rimr!

ทดสอบที่นี่

คำอธิบาย

ri e# Read input and convert to integer N.
mr e# Get a uniformly random value in [0 1 ... N-1].
!  e# Logical NOT, turns 0 into 1 and everything else into 0.

11
" ต้องรวดเร็วกับสิ่งเหล่านี้ ... " ซึ่งเป็นเหตุผลที่ไม่เห็นด้วยกับ OP ที่ " มีความท้าทายรหัสกอล์ฟที่ไม่ง่ายพอ " หาก FGITW เป็นปัญหา IMO มันง่ายเกินไป
ปีเตอร์เทย์เลอร์

12

TI-BASIC 4 ไบต์โดยใช้หนึ่งไบต์โทเค็น

not(int(Ansrand

พิจารณาว่าส่วนจำนวนเต็มของอินพุทคูณด้วยจำนวนสุ่มใน [0,1) เป็นศูนย์หรือไม่ Ansrand<1ยังใช้งานได้


เป็นอย่างไร ... นั่นคือสี่ไบต์?
John Dvorak

3
@JanDvorak ไบต์แรกไม่ได้ (ถัดไปคือ int (ถัดไปคือ Ans ถัดไปคือ rand) โดยทั่วไปเครื่องคิดเลขกราฟไม่ได้ใช้ ASCII เป็นตัวแทนภายในสำหรับโปรแกรม
user253751

@immibis โดยทั่วไปคอมพิวเตอร์ไม่ได้ใช้ ASCII เช่นกัน นี่อาจเป็นคำถามมีการอภิปรายเกี่ยวกับเมตาหรือไม่
Kroltan

7
@ Kroltan ใช่; นี่คือการสนทนาเมตาและนี่คือรายการของโทเค็นที่เป็นหนึ่งไบต์ซึ่งรวมถึงทั้งสี่ที่ฉันใช้
lirtosiast

@ThomasKwa ขอบคุณ!
Kroltan

11

MATL, 5 ไบต์

สามเวอร์ชั่นที่แตกต่างกันของอันนี้ความยาวทั้งหมด 5

iYr1=

ซึ่งรับอินพุต ( i) สร้างจำนวนเต็มแบบสุ่มระหว่าง 1 ถึงตัวเลขนั้น ( Yr) และดูว่ามันเท่ากับ 1 ( 1=) อีกวิธีหนึ่งคือ

li/r>

ทำ 1 ( lเป็นวิธีแก้ปัญหาเนื่องจากมีข้อผิดพลาดกับการทำ1iในขณะนี้) นำเข้า ( i) หารเพื่อรับ 1 / N ( /) ทำตัวเลขสุ่มระหว่าง 0 และ 1 ( r) และดูว่าการสุ่ม จำนวนน้อยกว่า 1 / N หรือ,

ir*1<

take และ input ( i) และคูณด้วยตัวเลขสุ่มระหว่าง 0 ถึง 1 ( r*) และดูว่าผลลัพธ์มีขนาดเล็กกว่า 1 ( 1<) หรือไม่

ใน Matlab ไม่ใช่ MATL คุณสามารถทำหน้าที่ที่ไม่ระบุชื่อได้

@(n)n*rand<1

สำหรับ 12 ไบต์ซึ่งถูกใช้โดยการทำans(5)ตัวอย่างเช่น


10

JavaScript ES6, 15 ไบต์

-5 ไบต์ขอบคุณ Downgoat

x=>1>new Date%x

ตามออก (ใช้) ของนี้เทคนิคของคำตอบ


1
new Dateยังสามารถใช้งานได้และอาจบันทึกไม่กี่ไบต์
Downgoat

@Downgoat อาใช่วันที่แบบแผน!
Conor O'Brien

10

Julia, 17 16 15 ไบต์

n->2>rand(1:n)

นี้เป็นฟังก์ชั่นที่สร้างจำนวนเต็มสุ่มระหว่าง 1 nและการทดสอบไม่ว่าจะเป็นน้อยกว่า 2. จะมี 1 / n โอกาสนี้เกิดขึ้นและทำให้ 1 / n trueโอกาสของการกลับมา

บันทึก 1 ไบต์ขอบคุณ Thomas Kwa!


9

Microscript II , 3 ไบต์

NR!

อ่านจำนวนเต็มnสร้างจำนวนเต็มแบบสุ่มระหว่าง0และn-1(รวม) แล้วใช้การปฏิเสธบูลีนกับค่านั้น


8

ลูกกวาด 2 ไบต์

Hn

Hย่อมาจากHeisen-double

nหมายถึงไม่

'n' ถูกส่งผ่านด้วยแฟล็ก -i เป็นอินพุตตัวเลข ค่าที่เหลืออยู่บนสแต็กจะถูกพิมพ์เมื่อออก

แบบฟอร์ม "ยาว":

rand   # number between 0 and pop()
not    # cast to int, invert non-zero to zero, and zero to one

ฉันคิดว่าคุณต้องนับ-iเป็นหนึ่งไบต์
lirtosiast

1
โดยพื้นฐานแล้ววิธีเดียวในการส่งอินพุตตัวเลขคือพร้อมกับแฟล็ก -i ฉันเดาว่ามีเพียงภาษาที่อ่านจาก stdin เท่านั้นที่ไม่ได้รับโทษจากการป้อนข้อมูลจำเพาะ?
Dale Johnson

ถ้ามีแฟล็กอินพุตทั่วไปหรือคุณเพิ่งใช้ CLA ปกติเพื่อส่งผ่านอาร์กิวเมนต์ ดูเหมือนว่าไม่เป็นธรรมว่ามีการระบุประเภทข้อมูลฟรี
lirtosiast

2
@ThomasKwa ฟังก์ชันที่เขียนด้วยภาษาไดนามิกต้องนับจำนวนไบต์เพื่อระบุว่าอาร์กิวเมนต์เป็นจำนวนเต็มในเอกสารหรือไม่ ในlambda x: random.random()<1/x(ungolfed) นอกจากนี้ยังมี "ระบุฟรี" ที่อาร์กิวเมนต์เป็นตัวเลข
user253751

@immibis อืมนั่นเป็นจุดที่ดี ฉันเดาว่าการพยายามรักษากฎสำหรับโปรแกรมและฟังก์ชั่นแบบเดียวกันควรอนุญาตเช่นนี้ ฉันจะโพสต์บนเมตา
lirtosiast

7

อย่างจริงจัง 3 ไบต์

,JY

0เป็นเท็จและ1เป็นความจริง ลองออนไลน์

คำอธิบาย:

,JY
,    get input
 J   push a random integer in range(0, input) ([0, ..., input-1])
  Y  logical not: push 0 if truthy else 1  

7

R, 30 22 ไบต์

รหัส

cat(runif(1)<1/scan())          #new
f=function(N)cat(runif(1)<1/N)  #old

มันสร้างตัวเลขจากการแจกแจงแบบสม่ำเสมอ (0 ถึง 1) และควรประเมินค่าเป็น 1 / n ครั้ง


6

Japtap, 6 ไบต์

1>U*Mr

ลองออนไลน์!

Mrเทียบเท่ากับ Math.randomJS ที่เหลือค่อนข้างชัดเจน ฉันอาจเพิ่มฟังก์ชันตัวเลขที่สร้างทศนิยมแบบสุ่มระหว่าง 0 ถึงตัวเลข เมื่อสิ่งนี้เกิดขึ้นสองไบต์จะถูกบันทึกไว้:

1>Ur    // Doesn't currently work

รุ่นอื่น:

1>Ð %U

Ðเทียบเท่ากับnew Date(และวัตถุวันที่เมื่อถูกขอให้แปลงเป็นตัวเลขจะกลายเป็นเวลาประทับปัจจุบันในหน่วยมิลลิวินาที ดังนั้นนี่เป็นการสุ่มทั้งหมดยกเว้นว่าจะมีการเรียกใช้หลายครั้งต่อ ms


6

Marbelous , 21 ไบต์

}0    # takes one input n
--    # decrements n
??    # random value from range 0..n (inclusive)
=0?0  # push right if not equal to 0, fall through otherwise | convert to zero
++    # increment | no-op
{0//  # output | push left

ฉัน0ถูกหลอกและ1เป็นความจริงแม้ว่าจะไม่มีเหตุผลที่แท้จริงสำหรับการเห็นว่า Marbelous ไม่ได้มีถ้า Marbelousy เพิ่มเติมจะถูกเอาท์พุท{0เป็นจริงและ{>เป็นเท็จ นี่จะเป็นดังนี้:

}0
--
??
=0{>
{0

แต่ฉันไม่แน่ใจว่าถูกต้อง


ฉันจะใช้สำหรับการสนทนาเมตาเกี่ยวกับเรื่องนี้ มุมมองแบบย่อของฉัน: การส่งออกค่าไปยังเอาต์พุตอื่นจะเทียบเท่ากับการมีเอาต์พุตทูเปิลต่างกันในภาษาอื่น หาก (nil, 1) และ (1, ไม่มี) สามารถเป็นค่าความจริงและความเท็จของคุณในภาษาอื่นก็ควรอนุญาตให้ {0 vs {> ใน Marbelous PS: รุ่น {> ของคุณจะไม่ออกเนื่องจากคุณไม่เคยเติมเอาต์พุตอื่น
Sparr

@ Sparr มันจะออกเนื่องจากไม่มีการใช้งานไม่?
overactor

คุณถูก. ฉันรู้สึกเป็นใบ้
Sparr

6

APL, 6 3 ไบต์

+=?

นี่คือฟังก์ชั่นการฝึกอบรมที่ใช้จำนวนเต็มและส่งกลับ 1 หรือ 0 (APL ของจริง / เท็จ) เราสร้างจำนวนเต็มแบบสุ่มจาก 1 ถึงอินพุตโดยใช้?จากนั้นตรวจสอบว่าอินพุตเท่ากับจำนวนเต็มนั้นหรือไม่ ผลลัพธ์นั้นมีโอกาส 1 / อินพุตของจริง

บันทึกแล้ว 3 ไบต์ขอบคุณ Thomas Kwa!


@ThomasKwa ฉันคิดเรื่องรถไฟบางอย่าง แต่นั่นนับว่าเป็น "ฟังก์ชั่นที่มีชื่อ" หรือไม่หากได้รับมอบหมาย ฉันเดาว่าส่วน "ชื่อ" กำลังขว้างฉันมาที่นี่เพราะมันผิดปกติ
Alex A.

@ThomasKwa การมอบหมายรถไฟ (และฟังก์ชั่นที่ได้รับ) นั้นขนานไปกับการมอบหมายอื่น ๆ ทั้งหมดอย่างสมบูรณ์
อดัม

@NBZ คุณหมายถึงอะไรโดยขนาน?
lirtosiast

@ThomasKwa เทียบเท่า; ทำตัวเหมือนฟังก์ชั่นอื่น ๆ
อดัม

ฉันจะใช้แทน '+' เพราะ+หมายถึงการผันคำกริยาสำหรับจำนวนเชิงซ้อน แน่นอนว่ามันไม่สำคัญที่นี่และ+เป็นฟังก์ชั่นเอกลักษณ์ดั้งเดิม (ไม่มีตัวเลือก) แต่ตอนนี้เรามี(เหมือนกัน) ไม่มี ops อื่น ๆ สำหรับสเกลาร์คือ: (เป็นรูปธรรม), (เลือก), (ล้อม), (แยก), (ผสม), (ไม่ซ้ำกัน), (เกณฑ์), ,(ravel), ( ravel), (ตาราง), (ย้อนกลับ), (ย้อนกลับ) ก่อน) และ(โอนย้าย) บางคนเปลี่ยนสเกลาร์เป็นเวกเตอร์หรือเมทริกซ์
อดัม

6

PlatyParขนาด 3 ไบต์

#?!

#?รับตัวเลขสุ่ม[0,n)ที่nมีการป้อนข้อมูล !ผลตอบแทนtrueถ้าจำนวนก่อนที่มันจะเป็นอื่นก็จะส่งกลับ0false

การใช้คุณสมบัติล่าสุดเพิ่มเติมที่มีการใช้งาน (แต่น่าเสียดายที่ฉันไม่ได้มุ่งมั่น) ก่อนที่คำถามจะถูกถามฉันสามารถเอามันลงไป 2 ด้วย~! ลองออนไลน์ !


5

Java, 43 ไบต์

boolean b(int a){return a*Math.random()<1;}

1
a->a*Math.random()<1สั้นกว่า
TheNumberOne

ควรระบุ "Java 7 หรือก่อนหน้า"
corsiKa

@corsiKlauseHoHoHo งานนี้ใน Java 8 เช่นกันแม้ว่า
SuperJedi224

1
แน่นอนมันทำ - แต่มันไม่ใช่ golfed สำหรับ Java 8 ซึ่งจะใช้ lambdas เพื่อประหยัดพื้นที่ โดยตรรกะนั้นคำตอบทั้งหมดของ Java ก็เป็นคำตอบของ Groovy แต่ Groovy นั้นจะเหมือนกันหรือเล็กกว่าเสมอเพราะมันมีทางลัดที่ Java ไม่มี
corsiKa

5

C, 24 ไบต์

f(n){return!(rand()%n);}

ฉันย้อนกลับการแก้ไข OP ของการลบอักขระ 4 ตัวแรก เป็นเรื่องดีที่มีการลดจำนวนไบต์ แต่สำหรับฉันการมีสิ่งreturnที่f(n)ไม่ทำก็ไม่สมเหตุสมผล
เลเวลริเวอร์เซนต์

1
@insertusernamehere เป็นวิธีมาตรฐานในการได้รับจำนวนสุ่มในช่วงrand()%n 0..n-1คุณถูกต้องมันขึ้นอยู่กับ nการมีขนาดเล็กกว่ามากRAND_MAXแต่ไม่มีข้อ จำกัด ด้านบนสำหรับnคำถามที่กล่าวถึง วิธีการเลือกที่จะทำและปฏิเสธอีกม้วนจำนวนทั้งหมดจากnการ RAND_MAX nแต่มันจะไร้ความหวังที่ไม่มีประสิทธิภาพที่มีขนาดเล็ก
เลเวลริเวอร์

5

> <>, 27 + 3 สำหรับ -v = 30 ไบต์

นี่คือวิธีแก้ปัญหาที่ไม่เหมือนกันทั้งหมดที่ฉันดัดแปลง N ผลรวมของการสุ่มเลือก 15876 จาก 0 หรือ 1:

0"~":*>:?vr%0=n;
1-$1+$^-1x

N ต้องเป็นอินพุตในสแต็กที่มีแฟล็ก -v เอาต์พุตคือ 0 สำหรับความเท็จและ 1 สำหรับความจริง

โซลูชันที่ชาญฉลาดและสม่ำเสมอมากซึ่งใช้งานได้กับ 1/2 ^ N แทน:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n;
1n;>
 

สำหรับอินพุต 3 คุณมีโอกาส 1/8 ที่จะได้รับ 1 และ 7/8 จากการได้รับ 0

คำอธิบาย:

ฉันผนวกเท่าxตามความจำเป็นในสาย 4 และล้อมรอบพวกเขากับทิศทางจึงมีเพียงสองวิธีออกจากxทั้งการส่งออก falsey xหรือถัดไป หากทุกอย่างxไปในทิศทางที่ถูกต้องคนสุดท้ายจะไปยังผลลัพธ์ที่เป็นความจริง

ตัวอย่างเช่นสำหรับ N = 5 codespace สุดท้ายมีดังต่อไปนี้:

4{:?!v1-}:">"$2p:"x"$3p:"^"$4p1+:">"$3p1+!
   ^1<
0n; > > > > >
1n;>x>x>x>x>x>
    ^ ^ ^ ^ ^

ในขณะที่มันเป็นความจริงคุณไม่สามารถได้รับการกระจายที่สมบูรณ์แบบสำหรับ N โดยพลการ แต่ไม่มีใครสามารถใช้ PRNG ได้ คุณสามารถวนซ้ำ xa สองสามครั้งเพื่อรับบิตสุ่มรวมเข้าด้วยกันเป็น int I จากนั้นใช้ I% N เป็นค่าสุ่มของคุณ
Sparr

@ Sparr แก้ไขคำตอบของฉัน แต่ฉันรู้สึกว่าการใช้การวนซ้ำจำนวนมากจะ 'เฉลี่ย' จำนวนเต็มที่เกิดขึ้นทำให้การส่งออกมีแนวโน้มที่จะไป(iterNum/2)%Nอย่างมาก ฉันไม่คิดว่าการใช้ตัวเลขที่ต่ำกว่าจะเป็นวิธีแก้ปัญหาเช่นกัน ฉันอาจจะไม่เข้าใจคุณค่อนข้างมากหรือคุณมีความคิดเพิ่มเติมเพื่อแก้ไขปัญหาให้ดีขึ้นหรือไม่?
แอรอน

แทนการเพิ่ม 15000 บิตเข้าด้วยกันสร้างเพียง 32 บิตและเชื่อมต่อกันทำให้คุณมีจำนวนเต็ม 32 บิตที่กระจายแบบสุ่ม mod ที่
Sparr

@Sparr ที่ดูเหมือนจะดีกว่าแน่นอนแม้ว่าฉันจะไม่รู้ว่าทำไม;) มันจะมีราคาสูงกว่าไบต์มาก (> <> แย่มากสำหรับการดำเนินงานไบต์และการแปลงฐาน) แต่ฉันจะเปลี่ยนคำตอบของฉันเมื่อเย็นนี้ (CEST)
แอรอน

คุณสามารถต่อบิตเข้าด้วยกันโดยการคูณสองและเพิ่ม: r = 0; สำหรับ (0..32) r = r * 2 + randbit;
Sparr

4

Mathematica, 18 16 ไบต์

#RandomReal[]<1&

โซลูชันพื้นฐาน ชื่อที่ไม่มีชื่อFunctionจะสร้างตัวเลขสุ่มใน [0, 1) คูณด้วยอาร์กิวเมนต์ของมันแล้วตรวจสอบว่ามันยังน้อยกว่า 1 หรือไม่


4

Python ขนาด 42 ไบต์

import random
lambda n:1>random.random()*n

แก้ไข : ลบtime.time()คำตอบเนื่องจากการแจกจ่าย


2
สำหรับrandomมันของมูลค่าการทำที่จะบันทึกในfrom random import* random.ไม่ได้สำหรับtimeแม้ว่า
xnor

1
ตัวเลขสุ่มสร้างขึ้นโดยส่วนโมดูโลจะไม่กระจายอย่างสม่ำเสมอ
ตรัง Oul

@ TrangOul นั่นเป็นจุดที่ดี สำหรับขนาดใหญ่ขึ้นnผลอาจสังเกตได้ ฉันคิดว่า1>time.time()%1*nสามารถทำงานได้
lirtosiast

@ TrangOul ฉันเข้าใจว่าคุณรู้ถึงความแตกต่างระหว่างrandใน C และtime.timePython ... หนึ่งคุณลักษณะที่ชัดเจนของหลังคือมันคืนค่าเวลาปัจจุบันซึ่งไม่ จำกัด ดังนั้นจึงtime.time()%nมีการแจกแจงแบบเดียวกัน nสำหรับการใด ๆ
253751

4

TeaScriptขนาด 3 ไบต์

!N×

ลองที่นี่

คำอธิบาย

 N  maps to Math.rand which is a utility function that returns an integer
    between `arg1` and `arg2` or `0` and `arg1` if only one argument is
    provided.
  × is expanded to `(x)`, where `x` is initialised with the value provided
    in the input boxes; × represents byte '\xd7'
!   negate the result, 0 results in true, anything else false

1
เจ็ดตัวอักษรเพิ่มได้ถึง 6 ไบต์ได้อย่างไร และ ANSI ถ่าน (R) a (ไบต์เดียว) คืออะไร?
อดัม

@NBZ ฮ่า ๆ ! ฉันคิดว่าฉันโกหก ... ฉันโทษอาการเมาค้าง ... ฉันจะอัปเดตตอนนี้เพราะฉันจะเปลี่ยนกลไกเป็นแบบตรงไปตรงมามากกว่าที่ฉันเพิ่งสังเกตเห็น! ในรุ่นปัจจุบันนี้®แสดงถึง char '\xae'ดังนั้นเป็นเพียงหนึ่งไบต์ :)
Dom Hastings

4

Fuzzy Octo Guacamole, 10 ไบต์

^-!_[0]1.|

คำอธิบาย:

^-!_[0]1.|

^          # Get input.
 -         # Decrement, so we can append <ToS> zeros and a 1 to the stack.
  !        # Set loop counter.
   _       # Pop, since we are done with the input.
    [      # Start loop
     0     # Push 0
      ]    # End for loop. We have pushed input-1 0s to the stack.
       1   # Push a single 1 to the stack.
        .  # Switch stacks
         | # Pick a random item from the inactive stack, which has n-1 falsy items and 1 truthy item, so the truthy probability is 1/n.
           # (implicit output)

3

Perl 6 ,  10   8 ไบต์

!(^*).pick
#  ^- The * is the argument

รหัสนี้สร้างในช่วงตั้งแต่ 0 ขึ้นไป *แต่ไม่รวมถึงการป้อนข้อมูล จากนั้นก็picks หนึ่งที่สุ่มและผลตอบแทนที่แท้จริงเมื่อได้รับ!0

1>*.rand
# ^- The * is the argument

นี้จะใช้เวลาการป้อนข้อมูล*และคูณได้โดยการสุ่ม Num จากนั้นส่งกลับจริงถ้ามันมีขนาดเล็กกว่า0..^11

# store it in a lexical code variable for ease of use
my &code = 1>*.rand;

die "never dies here" unless code 1;

for ^8 { say code 4 }
False
True
False
False
False
True
False
False

3

Prolog (SWI) 24 ไบต์

รหัส:

p(N):-X is 1/N,maybe(X).

อาจจะ (+ P)เป็นฟังก์ชั่นที่ประสบความสำเร็จกับความน่าจะเป็นPและล้มเหลวด้วยความน่าจะเป็น1-P

ตัวอย่าง:

p(4).
false

p(4).
false

p(4).
true

3

PowerShell ขนาด 25 ไบต์

!(Random -ma($args[0]--))

Get-Randomฟังก์ชั่นเมื่อรับ-Maพารามิเตอร์ ximum ส่งกลับค่าจากช่วงn [0,n)เราใช้ประโยชน์โดยการลบ 1 จากอินพุตของเรา$args[0]ดังนั้นเราจึงจัดทำดัชนีเป็นศูนย์อย่างถูกต้องและรับค่าสุ่ม ได้อย่างแม่นยำ1/nTH ของเวลาที่คุ้มค่านี้จะเป็น0ดังนั้นเมื่อเราบูลีนไม่มันด้วยก็จะกลับ! Trueครั้งอื่น ๆ Falseที่จะกลับมา


3

J, 3 ไบต์

0=?

นี่คือส้อมเดี่ยวที่รับการโต้แย้งทางด้านขวา ในทำนองเดียวกันกับ APL สร้างจำนวนเต็มแบบสุ่ม อย่างไรก็ตามอาร์เรย์ J เป็นแบบ zero-based เราเปรียบเทียบกับ 0 แทนที่จะเป็นอินพุท



3

PHP, 22 ไบต์

<?=2>rand(1,$argv[1]);

อ่านnจากบรรทัดคำสั่งเช่น:

$ php probability.php 4

เอาต์พุต( falseถูกส่งไปยังสตริงว่างใน PHP) หรือ1(ในกรณีของtrue)


3

C #, 56 45 ไบต์

ต้องขอบคุณ pinkfloydx33 มันเป็น 45 แล้ว

bool b(int n){return new Random().Next(n)<1;}

เก่า 56 ไบต์

สร้างจำนวนเต็มบวกแบบสุ่มที่ใหญ่กว่าหรือเท่ากับ 0 และเล็กกว่าnและตรวจสอบว่ามันเล็กกว่า1และส่งคืนผลลัพธ์การเปรียบเทียบ

bool a(int n){Random r=new Random();return r.Next(n)<1;}

1
ยินดีต้อนรับสู่ PPCG! แต่น่าเสียดายที่การส่งนี้จะไม่ทำงานเพราะRandom.Next(k)ผลตอบแทนที่เป็นจำนวนเต็มเช่นว่าk 0 <= k < nโดยการเปลี่ยนเงื่อนไข<1เป็นจะถูกต้อง นอกจากนี้การใช้แลมบ์ดานิพจน์อาจทำให้โค้ดของคุณสั้นลง
Mego

@ Mego แน่นอนขอบคุณสำหรับความคิดเห็น ฉันทำมัน0 < k <= nและมันควรจะเป็นอย่างที่คุณพูด ฉันจะแก้ไขทันที
ivaan

2
ใช้var rบันทึกสาม หรือถ้า c # 6 bool a(int n) => new Random().Next(n)<1;สำหรับ 41 แม้ว่าจะไม่แน่ใจว่าการเริ่มต้นใหม่Randomต่อวิธีการโทรจะทำงานอย่างถูกต้องเท่าการกระจาย?
pinkfloydx33

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.