1 / N ймовірність


29

Тому що не існує простих проблем з :

Створіть необов'язково програму або функцію без назви, яка, даючи (будь-якими способами) ціле число 1 ≤ N ≤ 10000, виводить значення True у вашій мові з псевдовипадковою ймовірністю 1 / N, помилково помилковою.

Зверніть увагу, що вимогу щодо називання видалено. Не соромтесь редагувати відповіді та оцінки відповідно.

Деякі мови використовують 1 (або -1) та 0 для True та False, це теж добре.

Приклад:

Приклад вхідних тестів:

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

Тобто дано 4; він повертає True з 25% шансом і False з 75% шансом.




Оскільки не всі мови вбудували "псевдовипадковість", чи можна отримати насіння як другий аргумент? (Напр. Brainfuck)
недолік

@flawr використовуйте поточний мілісекунд ...
2015 року

1
Що найбільше Nми маємо прийняти?
Toby Speight

Відповіді:


27

Шаблони MediaWiki з ParserFunctions , 48 байт

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

13
Цікавий вибір мови :-)
Adám

6
Хто, чорт, подумав, що було б розумно додати недетерміновані функції до шаблонів MediaWiki !?
користувач253751

4
@immibis: ну недетермінізм виникає #time, можливо, для оновлення віку живих людей тощо.
Віллем Ван Онсем

15

Pyth, 3 байти

!OQ

Спробуйте в Інтернеті

Проста інверсія випадкового вибору від 0 до входу

Забавно в Pyth неможливо зробити функцію, яка робить це без цього, $оскільки функції Pyth автоматично запам'ятовуються.



@LeakyNun Ага, я забув про використання часу для випадкової функції, це досить розумно.
FryAmTheEggman

Ні, я просто використав час, щоб його запам'ятати.
Лина монашка

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
« Повинен бути швидко з цими людьми ... » , яка є причиною не погодитися з О.П. , що « не вистачає простих коду для гольфу проблеми ». Якщо FGITW - це проблема, IMO - це занадто просто.
Пітер Тейлор

12

TI-BASIC, 4 байти з використанням одного байтового маркера

not(int(Ansrand

Визначає, якщо ціла частина вхідного разу випадкового числа в [0,1) дорівнює нулю. Ansrand<1також працює.


Як ... Це чотири байти?
Джон Дворак

3
@JanDvorak Перших байтів немає (наступний - int (наступний - Ans, наступний - rand. Загалом, графічні калькулятори не використовують ASCII як своє внутрішнє представлення для програм.
user253751,

@immibis В основному комп'ютери також не використовують ASCII. Це може бути сумнівним, чи існує мета дискусія з цього приводу?
Кролтан

7
@Kroltan Так; це мета-дискусія, і це список лексем, що є одним байтом, який включає всі чотири, які я використовував.
ліртосіаст

@ThomasKwa дякую!
Кролтан

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<

взяти і ввести ( 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

Джулія, 17 16 15 байт

n->2>rand(1:n)

Це функція, яка генерує випадкове ціле число між 1 і nперевіряє, чи не менше 2. Існує 1 / n шанс, що це станеться, і, таким чином, 1 / n шанс повернутися true.

Збережено 1 байт завдяки Томасу Ква!


9

Мікроскрипт II , 3 байти

NR!

Читає ціле число n, генерує випадкове ціле число між 0та n-1(включно), а потім застосовує булеве заперечення до цього значення.


8

Цукерки , 2 байти

Hn

H означає Гейзен-подвійний

n означає не

'N' передається з прапорцем -i як числовим введенням. Значення, залишені на стеку, друкуються при виході.

"Довга форма:

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

Я думаю, вам потрібно буде рахувати -iодин байт.
ліртосіаст

1
в основному єдиним способом передачі числового введення є прапор -i. Я здогадуюсь, що лише мови, які читаються з stdin, не зазнають певних вхідних санкцій?
Дейл Джонсон

Ну, якби був загальний прапор введення або ви просто використовували звичайні CLA, щоб передавати аргументи, це, безумовно, було б добре. Однак видається несправедливим, що тип даних задається безкоштовно.
ліртосіаст

2
@ThomasKwa Якщо функція, написана динамічною мовою, повинна рахувати байти, щоб вказати, що аргумент є цілим числом у документації? У lambda x: random.random()<1/x(neololfed) також "вказано безкоштовно", що аргументом є число.
користувач253751

@immibis Хм, це хороший момент. Я думаю, що намагання зберегти правила для програм та функцій однаковими, тоді має це дозволити. Я зроблю пост на мета.
ліртосіаст


7

R, 30 22 байт

код

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

Він генерує число з рівномірного розподілу (0 до 1) і має оцінювати до істинного 1 / n разів.


6

Japt, 6 байт

1>U*Mr

Спробуйте в Інтернеті!

Mrеквівалентно JS Math.random. Решта досить очевидно. Можливо, я міг би додати числову функцію, яка генерує випадковий проміжок між 0 і числом. Коли це станеться, два байти будуть збережені:

1>Ur    // Doesn't currently work

Альтернативна версія:

1>Ð %U

Ðеквівалентний new Date(, і об'єкт Date, коли його запитують перетворити на число, стає поточною міткою часу в мілісекундах. Таким чином, це цілком випадково, якщо тільки воно не виконується кілька разів на мс.


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бути правдоподібною, хоча немає реальної причини для того, щоб бачити, як Марбелус насправді не має. Більше Marbelousy виводиться на {0правдиве і {>на хибне. Це виглядатиме так:

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

Але я не впевнений, що це дійсно.


Я буду готовий до мета-дискусії з цього приводу. Коротка версія мого перегляду: виведення значення на інший вихід еквівалентно наявності різних кордонів виводу на іншій мові. Якщо (nil, 1) та (1, nil) можуть бути вашими значеннями truthy та falsey іншою мовою, то {0 vs {> слід дозволити в Marbelous. PS: ваша {> версія не вийде, тому що ви ніколи не заповнюєте інший результат.
Спарр

@Sparr він вийде через бездіяльність, ні?
спецодяг

Ти правий. Я почуваюсь німим.
Спарр

6

APL, 6 3 байти

+=?

Це функціональний потяг, який приймає ціле число і повертає 1 або 0 (вірний / хибний APL). Ми генеруємо випадкове ціле число від 1 до вводу, використовуючи ?, а потім перевіряємо, чи вхід дорівнює цьому цілому. Це призводить до імовірності 1 / введення в істину.

Збережено 3 байти завдяки Томасу Ква!


@ThomasKwa Я подумав про якийсь потяг, але чи дійсно це вважається "названою функцією", якщо вона призначена? Я здогадуюсь, що "названа" частина кидає мене сюди, оскільки це нетипово.
Олексій А.

@ThomasKwa Призначення поїздів (та похідних функцій) є повністю паралельним усім іншим завданням.
Адам

@NBZ, що ти маєш на увазі під паралеллю?
ліртосіаст

@ThomasKwa еквівалент; поводиться як будь-яке інше призначення функції.
Адам

Я б використав замість '+', тому що +означає Conjugate для складних чисел. Звичайно, це не має значення, і +це традиційна функція ідентичності (не-оп), але зараз ми маємо (те саме). Інший ні-OPS для скалярів є: (матеріалізація), (вибрати), (приклади), (сплит), (суміш), (унікальна), (залучати), ,(Равель), (таблиця), (зворотний), (зворотний спочатку) та (перенести). Деякі змінюють скаляр на вектор або матрицю.
Adám

6

PlatyPar , 3 байти

#?!

#?отримує випадкове число, [0,n)де nвводиться. !повертається, trueякщо число до нього є 0, інакше воно повертається false.

Використовуючи новіші функції, які були реалізовані (але, на жаль, для мене це не було), перш ніж це питання було задано, я можу зменшити його до 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
Звичайно, це так - але для Java 8 це не гольф, який би використовував лямбдаси для економії місця. За цією логікою всі відповіді на Java - це також відповіді Groovy, але Groovy завжди однаковий або менший, оскільки в ньому є ярлики, яких у Java немає.
corsiKa

5

C, 24 байти

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

Я повернув правки OP, видаливши перші 4 символи. Це приємно мати байт зменшений, але мені, маючи returnбез f(n)не має ніякого сенсу синтаксично.
Річка Рівня Св.

1
@insertusername rand()%nє стандартним способом отримання випадкового числа в діапазоні 0..n-1. Ви маєте рацію, вона покладається на nте, що вона набагато менша, RAND_MAXале немає верхньої межі, про яку nйдеться у питанні. Альтернативним підходом було б зробити відхилення та перекидання всіх номерів з nRAND_MAX, але це було б безнадійно неефективно n.
Рівень Св.

5

> <>, 27 + 3 для -v = 30 байт

Ось нерівномірне взагалі рішення, де я модифікую суму 15876 випадкових вибору 0 або 1:

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

N слід вводити в стек із прапорцем -v, вихід 0 для фальси та 1 для truthy.

Набагато розумніші та рівномірніші рішення, які працюють замість 1/2 ^ N:

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

Для введення 3 у вас є 1/8 шансів отримати 1 і 7/8 отримати 0.

Пояснення:

Я додаю стільки, xскільки потрібно в 4-му рядку, і оточую їх вказівками, щоб вийти з двох варіантів x: або фальсийний вихід, або наступний x. Якщо всі xйдуть у правильному напрямку, останній спрямовуватиметься до правдоподібного виходу.

Наприклад, для N = 5, кінцевим простором кодів є такий:

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

Хоча це правда, ви не можете отримати ідеального розподілу для довільного N, а також ніхто не може використовувати PRNG. Ви можете провести цикл через xa, щоб отримати купу випадкових бітів, зібрати їх у int I, а потім використовувати I% N як своє випадкове значення.
Спарр

@Sparr відредагував мою відповідь, але я відчуваю, що використання великої кількості ітерацій "середнє" отримане ціле число, завдяки чому вихід сильно прагне до (iterNum/2)%N. Я також не думаю, що використання меншої кількості також не буде рішенням. Хіба я, можливо, не зовсім вас зрозумів, чи ви маєте будь-яку подальшу ідею для кращого рішення?
Аарон

замість того, щоб додавати 15000 біт разом, виробляйте лише 32 біти і об'єднуйте їх, даючи вам рівномірно розподілене 32-бітове випадкове ціле число. мод що.
Спарр

@Sparr, що справді здається кращим, навіть якщо я не знаю, чому;) Це коштуватиме набагато більше байтів (> <> смокче для байтових операцій та конвертації бази), але я змінитиму відповідь сьогодні ввечері (CEST).
Аарон

ви можете об'єднати біти, помноживши на два і додавши: r = 0; для (0..32) r = r * 2 + randbit;
Спарр

4

Математика, 18 16 байт

#RandomReal[]<1&

Основне рішення. Неназваний Functionстворює випадкове число в [0, 1), помножує його на його аргумент і перевіряє, чи все ще менше 1.


4

Пітон, 42 байти

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

Редагувати : Вилучено time.time()відповідь через розповсюдження.


2
Бо randomварто from random import*економити random.. Не timeхоч.
xnor

1
Випадкові числа, породжені модульним поділом, розподілені не рівномірно .
Транг Оул

@TrangOul Це хороший момент; для збільшення nефект може бути помітний. Я думаю, 1>time.time()%1*nмогло б спрацювати.
lirtosiast

@TrangOul Я припускаю, що ви знаєте різницю між randC і 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 байт? І чи (R) - (однобайтовий) ANSI-символ?
Адам

@NBZ, ха-ха! Я думаю, що збрехав ... Я звинувачую в похміллі ... Я оновлюсь зараз, коли збираюся змінити механізм на більш простий, який я щойно помітив! У цій поточній версії ®символом char '\xae'є лише один байт. :)
Дом Гастінгс

4

Нечітка Окто Гуакамоле, 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 випадково один і !повертає True, коли він отримує a 0.

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

Це приймає вхід *і помножує його на випадкове число, 0..^1а потім повертає True, якщо він був меншим за 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

Пролог (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/nв цей час це значення буде 0, тому коли ми булеві - не воно з !ним повернеться True. Інші часи повернуться False.


3

J, 3 байти

0=?

Це монадічна вилка, яка бере аргумент справа. Аналогічно APL,? генерує випадкове ціле число; однак J-масиви базуються на нулі. Тому ми порівнюємо 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 Звичайно, дякую за коментар. Я це зробив, 0 < k <= nі це має бути, як ти сказав. Я негайно це виправлю.
ivaan

2
Використовуйте var rзаощаджує три. Або якщо c # 6, bool a(int n) => new Random().Next(n)<1;для 41. Хоча не впевнений, чи ініціалізація нового Randomза викликом методу буде працювати належним чином, що стосується розподілу?
pinkfloydx33

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.