>>> let gen = mkStdGen 26 >>> fst $ randomR ('a', 'z') gen 'z' >>> fst $ randomR ('a', 'z') gen 'z'For continuous types there is no requirement that the values lo and hi are ever produced, but they may be, depending on the implementation and the interval. There is no requirement to follow the Ord instance and the concept of range can be defined on per type basis. For example product types will treat their values independently:
>>> fst $ randomR (('a', 5.0), ('z', 10.0)) $ mkStdGen 26 ('z',5.22694980853051)In case when a lawful range is desired uniformR should be used instead.
>>> let gen = mkStdGen 26 >>> fst $ randomR ('a', 'z') gen 'z' >>> fst $ randomR ('a', 'z') gen 'z'For continuous types there is no requirement that the values lo and hi are ever produced, but they may be, depending on the implementation and the interval. There is no requirement to follow the Ord instance and the concept of range can be defined on per type basis. For example product types will treat their values independently:
>>> fst $ randomR (('a', 5.0), ('z', 10.0)) $ mkStdGen 26 ('z',5.22694980853051)In case when a lawful range is desired uniformR should be used instead.
>>> let gen = mkStdGen 2021 >>> fst $ randomR ('a', 'z') gen 't' >>> fst $ randomR ('z', 'a') gen 't'For continuous types there is no requirement that the values lo and hi are ever produced, but they may be, depending on the implementation and the interval. There is no requirement to follow the Ord instance and the concept of range can be defined on per type basis. For example product types will treat their values independently:
>>> fst $ randomR (('a', 5.0), ('z', 10.0)) $ mkStdGen 2021 ('t',6.240232662366563)In case when a lawful range is desired uniformR should be used instead.