如何在不使用任何种子的情况下从范围(a,b)在Haskell中生成随机数?
该函数应返回Int而不是IO Int.我有一个函数X,它接受Int和其他参数并输出一些不是IO的东西.
如果这不可能,我如何使用时间库生成种子并使用mkStdGen生成范围内的随机数?
任何帮助将非常感激.
ham*_*mar 41
函数不能返回Intwithout IO,除非它是纯函数,即给定相同的输入,您将始终获得相同的输出.这意味着如果你想要一个没有的随机数IO,你需要将种子作为参数.
如果您选择接种,它应该是类型StdGen,您可以使用它randomR来生成一个数字.使用newStdGen创建一个新的种子(这将在做IO).
> import System.Random
> g <- newStdGen
> randomR (1, 10) g
(1,1012529354 2147442707)
Run Code Online (Sandbox Code Playgroud)
结果randomR是一个元组,其中第一个元素是随机值,第二个元素是用于生成更多值的新种子.
否则,您可以使用randomRIO直接在IOmonad中获取随机数,并StdGen为您处理所有内容:
> import System.Random
> randomRIO (1, 10)
6
Run Code Online (Sandbox Code Playgroud)如果不诉诸各种不安全的做法,则此类功能不可能具有类型Int而不是类型IO Int或类似的东西。类型的函数(在这种情况下为常量)Int是纯函数,这意味着每次“调用”函数(检索常量的值)时,都可以保证“返回”得到相同的值。
如果要在每次调用时返回不同的,随机选择的值,则需要使用IO-monad。
在某些情况下,您可能希望为整个程序提供一个随机产生的值,即,从程序的角度来看,它的行为就像是一个纯值。每次在程序的相同运行中查询该值,您都将获得相同的值。由于整个程序本质上是一个IO-action,因此您可以一次生成该值并将其传递给它,但这可能会有些笨拙。有人可能会争辩说,在这种情况下,将值与类型的顶级常量相关联Int并用于unsafePerformIO构造该常量仍然是安全的:
import System.IO.Unsafe -- be careful!
import System.Random
-- a randomly chosen, program-scoped constant from the range [0 .. 9]
c :: Int
c = unsafePerformIO (getStdRandom (randomR (0, 9)))
Run Code Online (Sandbox Code Playgroud)