Unbias a random generator: Difference between revisions
Content added Content deleted
(Add Nimrod) |
(added Elixir) |
||
Line 394: | Line 394: | ||
5: 19.958% 49.987% |
5: 19.958% 49.987% |
||
6: 16.660% 49.890%</pre> |
6: 16.660% 49.890%</pre> |
||
=={{header|Elixir}}== |
|||
<lang elixir> |
|||
defmodule Random do |
|||
def init() do |
|||
:random.seed(:erlang.now()) |
|||
end |
|||
def randN(n) do |
|||
if Enum.member?(3..6, n) do |
|||
if :random.uniform(n) == 1, do: 1, else: 0 |
|||
end |
|||
end |
|||
def unbiased(n) do |
|||
{x, y} = {randN(n), randN(n)} |
|||
if x != y, do: x, else: unbiased(n) |
|||
end |
|||
end |
|||
IO.puts "N biased unbiased" |
|||
Random.init() |
|||
for n <- 3..6 do |
|||
xs = for _ <- 1..10000, do: Random.randN(n) |
|||
ys = for _ <- 1..10000, do: Random.unbiased(n) |
|||
IO.puts "#{n} #{Enum.sum(xs) / Enum.count(xs)} #{Enum.sum(ys) / Enum.count(ys)}" |
|||
end |
|||
</lang> |
|||
Output: |
|||
<pre> |
|||
N biased unbiased |
|||
3 0.3356 0.5043 |
|||
4 0.2523 0.4996 |
|||
5 0.2027 0.5041 |
|||
6 0.1647 0.4912 |
|||
</pre> |
|||
=={{header|Euphoria}}== |
=={{header|Euphoria}}== |