How to resolve the algorithm Modified random distribution step by step in the Haskell programming language
How to resolve the algorithm Modified random distribution step by step in the Haskell programming language
Table of Contents
Problem Statement
Given a random number generator, (rng), generating numbers in the range 0.0 .. 1.0 called rgen, for example; and a function modifier(x) taking an number in the same range and generating the probability that the input should be generated, in the same range 0..1; then implement the following algorithm for generating random numbers to the probability given by function modifier:
Show your output here, on this page.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Modified random distribution step by step in the Haskell programming language
The Haskell source code defines three functions: modify
, vShape
, and hist
. Here's an explanation of each function:
-
modify
: This function takes two arguments:f
: A function that takes an element of typea
and returns an element of typea
.lst
: A list of elements of typea
.
The
modify
function applies thef
function to each element of the list, and then removes elements from the list when the next element is smaller than the previous element after applyingf
. -
vShape
: This function takes one argument:x
: A numerical value
The
vShape
function calculates a V-shaped value based on the inputx
. It returns2*(0.5-x)
ifx
is less than 0.5, and2*(x-0.5)
otherwise. -
hist
: This function takes two arguments:b
: A numerical value representing the bin sizelst
: A list of numerical values
The
hist
function calculates a histogram of distribution for thelst
of values. It divides each value in the list by the bin sizeb
, rounds the result to the nearest integer, and groups the rounded values together. The frequency of each rounded value is then calculated, and the result is converted into a list of tuples, where each tuple contains a bin value and the frequency of that bin.
Here's an example usage of the hist
function:
import System.Random
main :: IO ()
main = do
-- Generate a list of 100 random numbers between 0 and 1
g <- getStdGen
let lst = map (/10) $ randoms g :: [Double]
-- Create a histogram with a bin size of 0.1
let h = hist 0.1 lst
-- Print the histogram
showHist h
This example will generate a histogram of the random numbers in the list lst
and print the result. Each bin in the histogram will represent a range of 0.1. For example, the output might look something like this:
0.00 ▇ 10%
0.10 ▇▇ 20%
0.20 ▇▇▇▇ 40%
0.30 ▇▇▇ 30%
Source code in the haskell programming language
import System.Random
import Data.List
import Text.Printf
modify :: Ord a => (a -> a) -> [a] -> [a]
modify f = foldMap test . pairs
where
pairs lst = zip lst (tail lst)
test (r1, r2) = if r2 < f r1 then [r1] else []
vShape x = if x < 0.5 then 2*(0.5-x) else 2*(x-0.5)
hist b lst = zip [0,b..] res
where
res = (`div` sum counts) . (*300) <$> counts
counts = map length $ group $
sort $ floor . (/b) <$> lst
showHist h = foldMap mkLine h
where
mkLine (b,n) = printf "%.2f\t%s %d%%\n" b (replicate n '▇') n
You may also check:How to resolve the algorithm Loops/N plus one half step by step in the TUSCRIPT programming language
You may also check:How to resolve the algorithm Literals/String step by step in the PowerShell programming language
You may also check:How to resolve the algorithm Read a configuration file step by step in the Red programming language
You may also check:How to resolve the algorithm Scope modifiers step by step in the TXR programming language
You may also check:How to resolve the algorithm Boolean values step by step in the Delphi programming language