Solía SipHash para ese propósito
import Data.ByteArray.Hash
import Data.ByteString (pack, cons)
import Data.Word (Word8, Word64)
random :: Word64 -> Word64 -> [Word8] -> Double
random a b cs = (subtract 1) . (/(2**63)) . read . drop 8 . show $ sipHash (SipKey a b) (pack cs)
la lectura y soltar 8 y espectáculo de servir al propósito para perder un newtype que no lo hace (o no hizo cuando he implementado este) apoya ninguna de fundición
ahora quiere un int en un rango. Entero es más fácil sin embargo:
random :: Word64 -> Word64 -> [Word8] -> (Integer, Integer) -> Integer
random a b cs (low,high) = let
span = high-low
rand = read . drop 8 . show $ sipHash (SipKey a b) (pack cs)
in (rand `mod` span) + low
por supuesto, usted todavía tendrá el mismo número de los mismos argumentos cada vez, por lo que tendrá que variar ellas, es decir, que todavía pasa alrededor de los argumentos, los valores devueltos no demasiado . Si eso es más conveniente que una mónada depende (para mi propósito era)
esto es cómo hice argumentos seguro (en concreto el [Word8] argumento) siempre sería diferente:
foo bytes = doSomethingRandom bytes
bar bytes = map (\i -> foo (i:bytes)) [1..n]
baz bytes = doSomething (foo (0:bytes)) (bar (1:bytes))
http: // stackoverflow .com/a/2738824/570689 - buena respuesta para una pregunta similar –
Parece que lo mejor que puedes esperar es 'randomInt lo hi = lo' o algo por el estilo. Sin algún tipo de semilla o IO, la función tiene que devolver el mismo valor cada vez. Y el límite inferior es tan aleatorio como cualquier otro 'Int'. :) – augustss
"Cualquiera que considere métodos aritméticos para producir dígitos aleatorios está, por supuesto, en estado de pecado". Atribuido a John Von Neumann en Knuth, D. _The Art of Computer Programming_, vol 2, p. 1 (1981). – rickythesk8r