Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell如何确定随机生成的数字是哪种布尔数?_Haskell_Random - Fatal编程技术网

Haskell如何确定随机生成的数字是哪种布尔数?

Haskell如何确定随机生成的数字是哪种布尔数?,haskell,random,Haskell,Random,考虑以下两组代码: random (mkStdGen 1) :: (Int, StdGen) -- returns (7918028818325808681,545291967 2103410263) random (mkStdGen 1) :: (Bool, StdGen) -- returns (True,80028 40692) random (mkStdGen 949488) :: (Int, StdGen) -- returns (9159618695640234475,58

考虑以下两组代码:

random (mkStdGen 1) :: (Int, StdGen) 
-- returns (7918028818325808681,545291967 2103410263)
random (mkStdGen 1) :: (Bool, StdGen) 
-- returns (True,80028 40692)


random (mkStdGen 949488) :: (Int, StdGen) 
-- returns (9159618695640234475,587416689 2103410263)
random (mkStdGen 949488) :: (Bool, StdGen)
-- returns (False,1485632275 40692)

为什么
7918028818325808681
转换为
True
,而
9159618695640234475
转换为
False

实例Bool
实例Int
共享实现,但共享的代码是
randomR
的代码,它具有一个范围。我们可以使用快速检查来验证这一点:

Prelude> import Test.QuickCheck
Prelude Test.QuickCheck> import System.Random
Prelude Test.QuickCheck System.Random> :{
Prelude Test.QuickCheck System.Random| prop seed = let
Prelude Test.QuickCheck System.Random|   gen = mkStdGen seed
Prelude Test.QuickCheck System.Random|   b = fst (random gen)
Prelude Test.QuickCheck System.Random|   i = fst (randomR (0,1) gen)
Prelude Test.QuickCheck System.Random|  in if b then i == 1 else i == 0
Prelude Test.QuickCheck System.Random| :}
Prelude Test.QuickCheck System.Random> quickCheck prop
+++ OK, passed 100 tests.
您还可以查看以下代码:

instance Random Bool where
  randomR (a,b) g = 
      case (randomIvalInteger (bool2Int a, bool2Int b) g) of
        (x, g') -> (int2Bool x, g')
       where
         bool2Int :: Bool -> Integer
         bool2Int False = 0
         bool2Int True  = 1

     int2Bool :: Int -> Bool
     int2Bool 0 = False
     int2Bool _ = True

  random g    = randomR (minBound,maxBound) g
非常重要的是,您正在调用
randomR(0,1)
,然后将
0
映射到
False
1
映射到
True

> random (mkStdGen 949488) :: (Bool, StdGen)
(False,1485632275 40692)
> randomR (0,1) (mkStdGen 949488) :: (Int, StdGen)
(0,1485632275 40692)
> random (mkStdGen 1) :: (Bool, StdGen)
(True,80028 40692)
> randomR (0,1) (mkStdGen 1) :: (Int, StdGen)
(1,80028 40692)

实例Bool
实例Int
共享实现,但共享的代码是用于
randomR
的代码,它具有一个范围。我们可以使用快速检查来验证这一点:

Prelude> import Test.QuickCheck
Prelude Test.QuickCheck> import System.Random
Prelude Test.QuickCheck System.Random> :{
Prelude Test.QuickCheck System.Random| prop seed = let
Prelude Test.QuickCheck System.Random|   gen = mkStdGen seed
Prelude Test.QuickCheck System.Random|   b = fst (random gen)
Prelude Test.QuickCheck System.Random|   i = fst (randomR (0,1) gen)
Prelude Test.QuickCheck System.Random|  in if b then i == 1 else i == 0
Prelude Test.QuickCheck System.Random| :}
Prelude Test.QuickCheck System.Random> quickCheck prop
+++ OK, passed 100 tests.
您还可以查看以下代码:

instance Random Bool where
  randomR (a,b) g = 
      case (randomIvalInteger (bool2Int a, bool2Int b) g) of
        (x, g') -> (int2Bool x, g')
       where
         bool2Int :: Bool -> Integer
         bool2Int False = 0
         bool2Int True  = 1

     int2Bool :: Int -> Bool
     int2Bool 0 = False
     int2Bool _ = True

  random g    = randomR (minBound,maxBound) g
非常重要的是,您正在调用
randomR(0,1)
,然后将
0
映射到
False
1
映射到
True

> random (mkStdGen 949488) :: (Bool, StdGen)
(False,1485632275 40692)
> randomR (0,1) (mkStdGen 949488) :: (Int, StdGen)
(0,1485632275 40692)
> random (mkStdGen 1) :: (Bool, StdGen)
(True,80028 40692)
> randomR (0,1) (mkStdGen 1) :: (Int, StdGen)
(1,80028 40692)

这个问题基于一个错误的前提:针对
Bool
random
的实现不需要(也不需要)调用针对
Int
random
的实现。我的示例代码基于一个名为“为了更好的目的学习Haskell!”的系列教程。因为我是初学者,我甚至不知道我的前提是错误的。你能解释一下你期望的输出是什么,为什么吗?@user38352这就是丹尼尔·瓦格纳告诉你的原因。他不是说“天哪,你应该知道得更清楚”,而是“你注意到的行为没有你猜到的原因”。很明显,你自己不可能知道前提是错误的,但是现在你已经被告知了,你知道了。万岁,为大家学习。@user38352您接受的答案包括
random@Bool
的完整来源。这个问题基于一个错误的前提:为
Bool
实现
random
不需要(也不需要)将
random
的实现称为
Int
。我的示例代码基于一个名为“向您学习Haskell以获得更好的效果!”的教程系列。因为我是初学者,我甚至不知道我的前提是错误的。你能解释一下你期望的输出是什么,为什么吗?@user38352这就是丹尼尔·瓦格纳告诉你的原因。他不是说“天哪,你应该知道得更清楚”,而是“你注意到的行为没有你猜到的原因”。很明显,你自己不可能知道前提是错误的,但是现在你已经被告知了,你知道了。万岁,为大家学习。@user38352您接受的答案包括
random@Bool
的完整来源。