1 / N olasılık


29

Çünkü yeterince basit mücadelesi bulunmuyor :

İsteğe bağlı olarak adlandırılmamış bir program veya işlev oluşturun, (herhangi bir şekilde) 1 ≤ N ≤ 10000 tamsayısı verilirse, dilinizin True değerini 1 / N yalancı rasgele olasılıkla, aksi takdirde False olarak verir.

Lütfen adlandırma gereksiniminin kaldırıldığını unutmayın. Cevapları ve puanları buna göre düzenlemek için çekinmeyin.

Bazı diller Doğru ve Yanlış için 1 (veya -1) ve 0 kullanır, bu da iyidir.

Örnek:

Örnek giriş testleri:

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

Yani 4 verdim; % 25 şans ile True,% 75 şans ile False döndürür.




Tüm diller "sözderandum" içinde olmadığı için, ikinci bir argüman olarak bir tohum elde etmek mümkün müdür? (Örn. Brainfuck)
kusur,

@flawr şu anki milisaniyeyi kullanın ...
15'te

1
Kabul Netmemiz gereken en büyük nedir ?
Toby Speight

Yanıtlar:


27

ParserFunctions ile MediaWiki şablonları , 48 bayt

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

13
Dilin ilginç seçimi :-)
Adám

6
Heck, MediaWiki şablonlarına deterministik olmayan fonksiyonlar eklemenin mantıklı olacağını düşündü !?
user253751,

4
@ immibis: iyi olmayan determinizm #timemuhtemelen yaşayan insanların yaşını, vb. güncellemekten kaynaklanır.
Willem Van Onsem

15

Pyth, 3 bayt

!OQ

Çevrimiçi deneyin

0'dan girişe rastgele seçimin basit inversiyonu

Eğlenceli bir şekilde $Pyth'te Pyth işlevleri otomatik olarak belleğe alındığından bunu yapmadan bir işlev yapmak mümkün değildir .



@ LeakyNun Ah doğru, rasgele bir fonksiyon için zamanı kullanmayı unutmuştum, bu oldukça zekice.
FryAmTheEggman

Hayır, sadece zamanın belleğini kaldırmak için kullandım.
Sızdıran Rahibe

1
Farkındayım, sanırım sadece iyi bir kelime söylemedim: P Eğer bir nedenden ötürü tam bir programdan daha iyi olsaydı, çoğu başvuru için gerçekten bir geçici çözüm olarak işe yarayacağını sanmadığımı söyledi. Zamanı bir argüman olarak kabul etmek muhtemelen varsayılan olarak izin verilmez.
FryAmTheEggman

1
@ LeakyNun Ben bu sorunun Qsonunda doldurduğum gibi doldurduğuna inanıyorum , aksi halde cevaplardım !O;)
FryAmTheEggman

12

CJam, 5 bayt

Bunlarla hızlı olmalı ...

rimr!

Burada test et.

açıklama

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
" Gotta bu olanları ... ile çabuk " bu OP katılmıyorum için bir neden " yeteri kadar basit bulunmamaktadır kod golf zorluklar ". FGITW bir sorunsa, IMO çok basit.
Peter Taylor

12

TI-BASIC, bir bayt jeton kullanarak 4 bayt

not(int(Ansrand

Giriş zamanlarının tamsayı bölümünün [0,1) içindeki rasgele bir sayının sıfır olduğunu belirler. Ansrand<1ayrıca çalışır.


Nasıl ... Bu dört bayt mı?
John Dvorak

3
Değil ilk bayt @JanDvorak (sonraki sonraki Ans, önümüzdeki Rand olduğunu, (int olduğu Genelde, hesap makineleri yok çizilmesi. Tutulamaz programlar için kendi iç temsili olarak ASCII kullanır.
user253751

@ immibis Genel olarak, bilgisayarlar da ASCII kullanmaz. Bu sorgulanabilir olabilir, bununla ilgili bir meta tartışma var mı?
Kroltan

7
@Kroltan Evet; Bu meta tartışma ve bu benim kullandığım dört tanesini de içeren bir bayt olan belirteçlerin listesi.
lirtosiast

@ThomasKwa teşekkürler!
Kroltan

11

MATL, 5 bayt

Bunun üç farklı versiyonu, hepsi 5.

iYr1=

bu bir girişi alır ( i), 1 ile o sayı ( Yr) arasında rastgele bir tam sayı oluşturur ve 1 ( 1=) değerine eşit olup olmadığını görür . Alternatif olarak,

li/r>

1 yapın, ( şu anda lyapmakta bir hata olduğundan dolayı bir geçici çözüm yapın 1i), bir girdi ( i) alın, 1 / N ( /) almak için bölün , 0 ile 1 ( r) arasında rasgele bir sayı yapın ve rastgele olup olmadığını görün. sayı 1 / N'den az. Veya,

ir*1<

take ve input ( i), ve 0 ile 1 ( r*) arasındaki rasgele bir sayı ile çarpın ve sonucun 1 ( 1<) ' den küçük olup olmadığına bakın .

MATL'de değil, Matlab'da, bu anonim işlevi yapabilirsiniz.

@(n)n*rand<1

ans(5)Örneğin, 12 bayt için kullanılır .


10

JavaScript ES6, 15 bayt

Downgoat sayesinde -5 bayt.

x=>1>new Date%x

Bu cevabın tekniğine dayanır (kullanır) .


1
new Dateayrıca çalışabilir ve birkaç bayt kurtarabilir
Downgoat

@Downgoat Ah, doğru, Tarih rastgele!
Conor O'Brien,

10

Julia, 17 16 15 bayt

n->2>rand(1:n)

Bu, 1 ile 1 arasında rasgele bir tam sayı üreten nve 2'den az olup olmadığını test eden bir işlevdir true.

Thomas Kwa sayesinde 1 byte kurtarıldı!


9

Mikroscript II , 3 bayt

NR!

Bir tamsayı okur n, 0ve n-1(dahil) arasında rastgele bir tamsayı oluşturur , sonra bu değere bir boolean olumsuzlama uygular.


8

Şeker , 2 bayt

Hn

H , Heisen-çift anlamına gelir.

n değil anlamına gelir

'N', -i bayrağıyla sayısal girdi olarak iletilir. İstifte bırakılan değerler çıkışta yazdırılır.

"Uzun" form:

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

Sanırım -ibir bayt olarak saymanız gerekecek .
lirtosiast

1
temelde sayısal girdiyi iletmenin tek yolu -i bayrağıyladır. Sanırım sadece stdin'den okunan diller girdi belirtimi cezası çekmiyor mu?
Dale Johnson

Genel bir giriş bayrağı olsaydı ya da argümanları iletmek için normal CLA'ları kullandıysanız, bu kesinlikle iyi olurdu. Yine de, veri türünün ücretsiz olarak belirtildiği haksız görünüyor.
lirtosiast

2
@ThomasKwa Dinamik bir dilde yazılmış bir fonksiyon, argümanın dökümantasyonda bir tamsayı olduğunu belirtmek için baytları saymalı mıdır? In lambda x: random.random()<1/x(ungolfed) aynı zamanda bağımsız değişkeni bir sayı olduğu "özgür için belirtilen" oluyor.
user253751

@ immibis Hmm, bu iyi bir nokta. Öyleyse, programların ve fonksiyonların kurallarını korumaya çalışıyorum, buna izin vermeliyiz. Meta üzerinde bir yazı yapacağım.
lirtosiast

7

Cidden, 3 bayt

,JY

01falsey ve truthy.Çevrimiçi deneyin

Açıklama:

,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 bayt

kod

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

Düzgün bir dağılımdan (0 dan 1 e kadar) bir sayı oluşturur ve zamanın 1 / n 'sini değerlendirmelidir.


6

Japt, 6 bayt

1>U*Mr

Çevrimiçi deneyin!

MrJS'ye eşittir Math.random. Gerisi oldukça açık. Muhtemelen 0 ile sayı arasında rasgele bir kayan nokta üreten bir sayı fonksiyonu ekleyebilirim. Bu olduğunda, iki bayt kaydedilir:

1>Ur    // Doesn't currently work

Alternatif sürüm:

1>Ð %U

Ðeşittir new Date(ve bir sayıya dönüştürülmesi istendiğinde Date nesnesi milisaniye cinsinden geçerli zaman damgası olur. Bu nedenle, ms başına birden çok kez çalıştırılmadıkça, bu tamamen rastgeledir.


6

Mermer , 21 bayt

}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

Ben geçtiniz 0Falsey olmak ve 1eğer Marbelous görünce gerçekten yok için gerçek bir neden yoktur olsa, truthy olmak. Daha fazla Marbelousy, {0doğru ve {>yanlış için çıkar. Bu şuna benzer:

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

Ama bunun geçerli olduğundan emin değilim.


Bu konuda meta tartışma için hazır olurum. Bakış açımın kısa versiyonu: Farklı bir çıktıya değer vermek başka bir dilde farklı çıktı tuplerine sahip olmakla eşdeğerdir. Eğer (nil, 1) ve (1, nil), başka bir dilde sizin hakikat ve falsey değerleriniz olabilirse, {0 vs {> Marbelous'ta izin verilmelidir. PS: {> sürümünüz çıkmaz çünkü diğer çıktıyı asla doldurmazsınız.
Sparr

@Sparr hareketsizlik nedeniyle kapanacak, hayır?
otorracı

Haklısın. Aptal hissediyorum.
Sparr

6

APL, 6 3 bayt

+=?

Bu bir tamsayı alan ve 1 veya 0 döndüren bir işlev trenidir (APL'nin doğru / yanlış). Kullanarak girişi 1'den rasgele bir tamsayı üretiyoruz ?, ardından girişin bu tamsayıya eşit olup olmadığını kontrol ediyoruz. Bu, 1 / girişli bir gerçek şansla sonuçlanır.

Thomas Kwa sayesinde 3 bayt kurtarıldı!


@ThomasKwa Bir tür tren hakkında düşündüm, ancak bu gerçekten atanmışsa "adlandırılmış işlev" olarak sayılıyor mu? Sanırım "adlandırılmış" kısmı atipik olduğu için beni buraya atıyor.
Alex A.

@ThomasKwa Trenlerin atanması (ve türetilmiş fonksiyonlar) diğer tüm görevlere tamamen paraleldir.
AdAm

@NBZ Paralel ile ne demek istiyorsunuz?
lirtosiast

@ThomasKwa Eşdeğeri; başka bir fonksiyon ataması gibi davranmak.
16’da:

Ben kullanırsınız yerine '+' yüzünden +karmaşık sayılar için araçlar Bağının. Elbette burada önemli değil ve +geleneksel kimlik (no-op) işlevidir, ama şimdi bizde (aynı) var. Skaler için diğer no-op'lar: ( maddeleştirme ), (toplama), (içine alma), (bölme), (karışım), (benzersiz), (liste), ,(topla), (tablo), (geri), (geri) ilk) ve (devrik). Bazı skalar bir vektör veya matris olarak değiştirir.
Adám

6

PlatyPar , 3 bayt

#?!

#?Girdi [0,n)nerede rastgele bir sayı alır n. önceki sayı ise !dönertrue0 , aksi takdirde döner false.

Bu soru sorulmadan önce uygulanan (ancak maalesef benim için yapılmayan) daha yeni özellikleri kullanmak ~! Çevrimiçi denemeyle 2'ye indirebilirim !


5

Java, 43 bayt

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

1
a->a*Math.random()<1daha kısa.
TheNumberOne

"Java 7 veya öncesi" belirtilmelidir.
corsiKa

@corsiKlauseHoHoHo Bu Java 8'de de olsa çalışıyor
SuperJedi224

1
Elbette öyle - ama alan kazanmak için lambda kullanacak olan Java 8 için golf oynamadı. Bu mantıkla, tüm Java cevapları aynı zamanda Groovy cevaplarıdır, ancak Groovy her zaman aynı ya da daha küçüktür çünkü Java’nın bilmediği kısayollar vardır.
corsiKa

5

C, 24 bayt

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

İlk 4 karakteri kaldırarak OP'in düzenlemesini geri aldım. İndirgenmiş byte 's güzel olması, ama bana sahip returnolmadan f(n)sözdizimsel herhangi bir anlam ifade etmiyor.
Seviye Nehri St

1
@insertusernamehere rand()%n, aralıkta rasgele bir sayı almanın standart bir yoludur 0..n-1. Haklısın, güveniyor n çok daha küçük olmasınaRAND_MAX ancak nsoruda belirtilenlerin üst sınırı yok . Alternatif bir yaklaşım, reddetmek ve nRAND_MAX'tan tüm numaralara yeniden gitmek olacaktır, ancak küçük umutsuzca verimsiz olacaktır n.
Seviye Nehri St

5

> <>, -V = 30 bayt için 27 + 3

Burada, 0 veya 1'in toplam 15876 rastgele seçicisinin toplamını modladığım, tek tip olmayan bir çözüm var:

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

-V işaretli yığında N girilmeli, çıktı falsey için 0, truthy için 1 olmalıdır.

Bunun yerine 1/2 ^ N için çalışan çok daha akıllı ve düzgün bir çözüm:

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

Bir giriş 3 için 1/8 kazanma şansınız 1/7/8 olur.

Açıklama:

Ben kadar ekleme x4 hat üzerinde gerekli ve dışarı sadece iki yolu vardır, böylece yön ile etraflarını olarak xFalsey çıkışını ya da sonraki ya: x. Hepsi xdoğru yöne giderse, sonuncusu gerçeğe yakın çıktıya yönlendirilir.

Örneğin N = 5 için son kod alanı aşağıdaki gibidir:

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

Doğru olsa da, keyfi N için mükemmel bir dağıtım elde edemezsiniz, hiçbiri PRNG kullanamaz. Bir grup rasgele bit elde etmek için birkaç kez xa döngü yapabilir, bunları bir int I'de birleştirebilir, ardından% N değerini rastgele değeriniz olarak kullanabilirsiniz.
Sparr

@Sparr cevabımı düzenledi, ancak çok sayıda yineleme kullanmanın ortaya çıkan tamsayıyı 'ortalama' yapacağını ve çıktının yoğun bir şekilde yöneldiğini hissediyorum (iterNum/2)%N. Daha düşük bir sayı kullanmanın da bir çözüm olacağını düşünmüyorum. Belki de seni tam olarak anlamadım mı, yoksa çözümü iyileştirmek için başka bir fikrin var mı?
Aaron

Birlikte 15000 bit eklemek yerine, yalnızca 32 bit üretmek ve bunları birleştirmek, size eşit bir şekilde dağıtılmış 32 bit rastgele tam sayı verir. Bunu mod.
Sparr

@Sparr gerçekten daha iyi görünüyor, nedenini bilmesem bile;) Çok daha fazla bayta mal olacak (> <> bayt işlemleri ve temel dönüşüm için berbat) ancak bu akşam cevabımı değiştireceğim (CEST).
Aaron

bitleri iki ile çarpıp ekleyerek birleştirebilirsiniz: r = 0; (0..32) için r = r * 2 + randbit;
Sparr

4

Mathematica, 18 16 bayt

#RandomReal[]<1&

Temel çözüm İsimsiz Function[0, 1) 'te rasgele bir sayı oluşturur, onu argümanıyla çarpar ve hala 1'den küçük olup olmadığını kontrol eder.


4

Python, 42 bayt

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

Düzenle : time.time()Dağıtım nedeniyle yanıt kaldırıldı .


2
Çünkü random, from random import*tasarruf etmeye değer random.. timeOlsa da değil .
xnor

1
Modulo bölünmesi tarafından üretilen rasgele sayılar düzgün dağılmaz .
Trang Oul

@TrangOul Bu iyi bir nokta; daha büyük olması niçin etki fark edilebilir. Bence 1>time.time()%1*nişe yarayabilir.
lirtosiast

@TrangOul randC ve time.timePython arasındaki farkı bildiğinizi varsayıyorum ... İkincisinin belirgin bir özelliği , sınırsız olan mevcut zamanı döndürmesidir ( böylece time.time()%nyeterince uzun bir süre boyunca). Herhangi biri için n.
user253751

4

TeaScript , 3 bayt

!N×

Burada dene.

açıklama

 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
Yedi karakter 6 bayta kadar nasıl ekler? Ve (R) bir (tek bayt) ANSI karakter?
00’de

@NBZ, haha! Sanırım yalan söyledim ... Akşamdan kalmışlığı suçluyorum ... Şimdi, daha önce fark ettiğimden daha basit bir mekanizma değiştireceğim için şimdi güncelleneceğim! Bu güncel sürümde ®char temsil eder, '\xae'bu yüzden sadece bir bayt. :)
Dom Hastings

4

Bulanık Octo Guacamole, 10 bayt

^-!_[0]1.|

Açıklama:

^-!_[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 bayt

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

Bu kod 0'dan yukarıya kadar bir Girdi oluşturur ancak girdi hariç *. Daha sonra pickrastgele bir s ve !bir aldığında True döndürür 0.

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

Bu girdiyi alır ve *rastgele bir Num ile çarpar 0..^1, daha küçükse True döndürür 1.

# 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 bayt

Kod:

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

belki (+ P) , olasılık P ile başarılı olan ve olasılık 1-P ile başarısız olan bir fonksiyondur.

Örnek:

p(4).
false

p(4).
false

p(4).
true

3

PowerShell, 25 Bayt

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

Get-RandomFonksiyonu , belirli bir -MaMüsaade edilen parametre naralığında bir değer verir [0,n). Girdilerimizden 1'i çıkararak kaldıracağız $args[0], bu yüzden düzgün bir şekilde sıfır indeksliyiz ve rastgele bir değer elde ediyoruz. Tam 1/nolarak zaman, bu değer olacak 0, yani Boolean yaptığımızda, !onunla değil True. Diğer zamanlar geri dönecek False.


3

J, 3 bayt

0=?

Bu, sağda tartışan monadik bir çatal. APL'ye benzer şekilde, rastgele bir tam sayı üretir; ancak, J dizileri sıfır tabanlıdır. Böylece girdi yerine 0 ile karşılaştırıyoruz.


3

Minkolang 0.14 , 7 bayt

1nH1=N.

Burada dene.

açıklama

1          Pushes 1
 n         Takes number from input
  H        Pops b,a and pushes a random integer between a and b, inclusive
   1=      1 if equal to 1, 0 otherwise
     N.    Output as number and stop.

3

PHP, 22 bayt

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

nGibi komut satırından okur :

$ php probability.php 4

Çıktılar ( falsePHP'de boş bir dizgeye yayınlanır) veya 1(durumunda true).


3

C #, 56 45 bayt

Teşekkürler, pinkfloydx33 şimdi 45.

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

Eski 56 bayt

0'dan daha büyük veya ona eşit ve daha küçük ve daha küçük rastgele pozitif bir tam sayı oluşturur ve daha küçük nolup olmadığını 1karşılaştırır ve karşılaştırma sonucunu döndürür.

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

1
PPCG'ye Hoşgeldiniz! Ne yazık ki, bu gönderme işe yaramadı, çünkü öyle Random.Next(k)bir tamsayı döndürür . Durumu değiştirerek doğru olacaktır. Ayrıca, bir lambda ifadesinin kullanılması kodunuzu kısaltabilir. k0 <= k < n<1
Mego

@Mego Tabii, yorumunuz için teşekkür ederiz. Ben yaptım 0 < k <= nve senin dediğin gibi olmalı. Hemen düzelteceğim.
ivaan

2
Kullanımı var rüç kaydeder. Veya eğer bool a(int n) => new Random().Next(n)<1;41 için c # 6 ise, Randomyöntem başına yeni bir çağrı başlatmanın dağıtıma kadar doğru çalışıp çalışmayacağından emin olmasanız da?
pinkfloydx33

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.