Вероятность 1 / N

29

Потому что не хватает простых задач по :

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

Обратите внимание, что требование к именованию было удалено. Не стесняйтесь редактировать ответы и оценки соответственно.

Некоторые языки используют 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%.

Адам
источник
1
Также актуален метапост .
AdmBorkBork
Поскольку не все языки имеют «псевдослучайность», возможно ли получить семя в качестве второго аргумента? (Например, Brainfuck)
flawr
@flawr использовать текущую миллисекунду ...
Адам
1
Что самое большое, что Nмы должны принять?
Тоби Спейт

Ответы:

27

Шаблоны MediaWiki с ParserFunctions , 48 байт

{{#ifexpr:1>{{#time:U}} mod {{{n}}}|true|false}}
DuhHello
источник
13
Интересный выбор языка :-)
Adám
6
Кто, черт возьми, подумал, что было бы разумно добавлять недетерминированные функции в шаблоны MediaWiki !?
user253751
4
@immibis: хорошо, что недетерминизм происходит #time, вероятно, для обновления возраста живых людей и т. д.
Виллем Ван Онсем
15

Pyth, 3 байта

!OQ

Попробуйте онлайн

Простая инверсия случайного выбора от 0 до ввода

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

FryAmTheEggman
источник
1
Возможно.
Лаки Монахиня
@ 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тоже работает.

lirtosiast
источник
Как ... Это четыре байта?
Джон Дворжак
3
@JanDvorak Первый байт - это не (, следующий - int (, следующий - Ans, следующий - rand. В общем, графические калькуляторы не используют ASCII в качестве внутреннего представления для программ.
user253751
@immibis В общем, компьютеры также не используют ASCII. Это может быть сомнительным, есть ли мета обсуждение этого?
Кролтан
7
@Kroltan Да; это мета-обсуждение, и это список токенов, которые составляют один байт, который включает все четыре, которые я использовал.
lirtosiast
@ThomasKwa спасибо!
Кролтан
11

MATL, 5 байтов

Три разные версии этой, все 5.

iYr1=

который принимает input ( i), генерирует случайное целое число от 1 до этого числа ( Yr) и проверяет, равно ли оно 1 ( 1=). С другой стороны ,

li/r>

сделайте 1 ( lобходной путь, потому что 1iв данный момент есть ошибка в выполнении), возьмите input ( 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 Ах, да, дата случайности!
Конор О'Брайен
10

Юлия, 17 16 15 байтов

n->2>rand(1:n)

Это функция, которая генерирует случайное целое число в диапазоне от 1 до nи проверяет, меньше ли оно значения 2. Вероятность этого составляет 1 / n, и, следовательно, вероятность возврата 1 / n true.

Сохранено 1 байт благодаря Томасу Ква!

Алекс А.
источник
9

Microscript II , 3 байта

NR!

Считывает целое число n, генерирует случайное целое число между 0и n-1(включительно), затем применяет логическое отрицание к этому значению.

SuperJedi224
источник
8

Candy , 2 байта

Hn

H обозначает Heisen-двойной

п означает не

'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, не подвергаются штрафу за спецификацию ввода?
Дейл Джонсон
Ну, если бы был общий входной флаг, или вы просто использовали обычные CLA для передачи аргументов, это определенно было бы хорошо. Тем не менее, кажется несправедливым, что тип данных указывается бесплатно.
lirtosiast
2
@ThomasKwa Должна ли функция, написанная на динамическом языке, подсчитывать байты, чтобы указать, что аргумент является целым числом в документации? В lambda x: random.random()<1/x(ungolfed) также «указано бесплатно», что аргумент является числом.
user253751 19.12.15
@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  
Mego
источник
7

R, 30 22 байта

код

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

Он генерирует число из равномерного распределения (от 0 до 1) и должно оцениваться как истинное 1 / n раз.

Mutador
источник
6

Japt, 6 байт

1>U*Mr

Попробуйте онлайн!

Mrэквивалентно JS Math.random. Остальное довольно очевидно. Я мог бы, вероятно, добавить числовую функцию, которая генерирует случайное число с плавающей точкой между 0 и числом. Когда это произойдет, будут сохранены два байта:

1>Ur    // Doesn't currently work

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

1>Ð %U

Ðэквивалентно new Date(, и объект Date, когда его просят преобразовать в число, становится текущей отметкой времени в миллисекундах. Таким образом, это совершенно случайно, если только он не запускается несколько раз за мс.

ETHproductions
источник
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) могут быть вашими истинными и ложными значениями на другом языке, то {0 против {> должно быть разрешено в Marbelous. PS: ваша версия {> не выйдет, потому что вы никогда не заполняете другой вывод.
Спарр
@Sparr это выйдет из-за бездействия, нет?
переиздание
Вы правы. Я чувствую себя глупо
Спарр
6

APL, 6 3 байта

+=?

Это последовательность функций, которая принимает целое число и возвращает 1 или 0 (истина / ложь APL). Мы генерируем случайное целое число от 1 до ввода, используя ?, а затем проверяем, равно ли входное значение этому целому числу. Это приводит к 1 / входной шанс истины.

Сохранено 3 байта благодаря Томасу Ква!

Алекс А.
источник
@ThomasKwa Я думал о каком-то поезде, но действительно ли он считается «именованной функцией», если назначен? Я думаю, что названная часть бросает меня сюда, потому что это нетипично.
Алекс А.
@ThomasKwa Назначение поездов (и производных функций) полностью параллельно всем другим назначениям.
Адам
@NBZ что вы подразумеваете под параллелью?
lirtosiast
@ThomasKwa Эквивалент; ведет себя как любое другое назначение функции.
Адам
Я бы использовал вместо «+», потому что +означает конъюгат для комплексных чисел. Конечно, здесь это не имеет значения, и +это традиционная функция идентификации (no-op), но теперь мы имеем (то же самое). Другими исключениями для скаляров являются: (материализация), (выбор), (заключение), (разделение), (смешивание), (уникальное), (включение), ,(расхождение), (таблица), (обратное), (обратное) первый) и (транспонировать). Некоторые превращают скаляр в вектор или матрицу.
Адам
6

PlatyPar , 3 байта

#?!

#?получает случайное число, [0,n)где nввод. !возвращается, trueесли число до него 0, иначе он возвращается false.

Используя более свежие функции, которые были реализованы (но, к сожалению, для меня это не зафиксировано), до того, как был задан этот вопрос, я могу довести его до 2 с помощью ~! Попробовать онлайн !

Cyoce
источник
5

Java, 43 байта

boolean b(int a){return a*Math.random()<1;}
SuperJedi224
источник
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);}
Уровень реки St
источник
Я откатил редактирование OP, удалив первые 4 символа. Это приятно иметь байт уменьшенный, но мне, имея returnбез f(n)не имеет никакого смысла синтаксически.
Уровень Река St
1
@insertusernamehere rand()%n- это стандартный способ получения случайного числа в диапазоне 0..n-1. Вы правы, это зависит от того, nчтобы быть намного меньше, чем, RAND_MAXно нет никакого верхнего предела для nупомянутого в вопросе. Альтернативным подходом было бы сделать отклонение и повторный бросок на все числа от nRAND_MAX, но это было бы безнадежно неэффективно при малых n.
Уровень реки St
5

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

Вот неоднородное для всех решение, где I mod 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: либо выход фальси, либо следующий 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 + рандбит;
Спарр
4

Mathematica, 18 16 байтов

#RandomReal[]<1&

Основное решение. Безымянный Functionсоздает случайное число в [0, 1), умножает его на свой аргумент и проверяет, все ли оно меньше 1.

LegionMammal978
источник
4

Python, 42 байта

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

редактировать : Удален time.time()ответ из-за распространения.

DuhHello
источник
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.
user253751
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, ха-ха! Я думаю, что солгал ... Я обвиняю похмелье ... Я обновлю сейчас, поскольку я собираюсь изменить механизм на более простой, который я только что заметил! В этой текущей версии ®символ '\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)
Rɪᴋᴇʀ
источник
3

Perl 6 ,  10   8 байт

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

Этот код создает диапазон от 0 до, но исключая входные данные *. Затем он pickодин случайный и !возвращает True, когда он получает 0.

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

Он принимает входные данные *и умножает их на случайное число Num, а 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
Брэд Гилберт b2gills
источник
3

Пролог (SWI), 24 байта

Код:

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

Maybe (+ P) - это функция, которая преуспевает с вероятностью P и терпит неудачу с вероятностью 1-P

Пример:

p(4).
false

p(4).
false

p(4).
true
Emigna
источник
3

PowerShell, 25 байт

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

Get-RandomФункция , когда данный -Maпараметр ximum nвозвращает значение из диапазона [0,n). Мы используем это, вычитая 1 из наших входных данных $args[0], чтобы правильно индексировать нулевое значение и получить случайное значение. Ровно 1/nв это время это значение будет 0, поэтому, когда мы будем булевыми, то оно с !ним не вернется True. Остальные времена вернутся False.

AdmBorkBork
источник
3

J, 3 байта

0=?

Это монадическая вилка, которая принимает аргумент справа. Аналогично APL? генерирует случайное целое число; однако J-массивы начинаются с нуля. Поэтому мы сравниваем с 0 вместо ввода.

lirtosiast
источник
3

PHP, 22 байта

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

Читает nиз командной строки, как:

$ php probability.php 4

Вывод ( falseприведен к пустой строке в PHP) или 1(в случае true).

insertusernamehere
источник
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;}
ivaan
источник
1
Добро пожаловать в PPCG! К сожалению, это представление не работает, потому что Random.Next(k)возвращает целое число kтакое, что 0 <= k < n. Изменив условие на <1, оно будет правильным. Кроме того, использование лямбда-выражения может сократить ваш код.
Мего
@Mego Конечно, спасибо за комментарий. Я сделал это, 0 < k <= nи это должно быть так, как вы сказали. Я исправлю это немедленно.
Иваан
2
Использование var rэкономит три. Или, если c # 6, bool a(int n) => new Random().Next(n)<1;для 41. Хотя не уверен, что инициализация нового Randomвызова каждого метода будет работать должным образом, насколько распределение?
pinkfloydx33