首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >适用于新矩阵的Haskell RandomGen

适用于新矩阵的Haskell RandomGen
EN

Stack Overflow用户
提问于 2014-04-28 07:38:30
回答 2查看 444关注 0票数 0

我必须在haskell中实现这个函数:

代码语言:javascript
运行
复制
insertRandomNumber :: RandomGen g => [[Int]] -> g -> ([[Int]], g)

该函数在我的矩阵中的随机位置插入一个随机数。我只能在有0的位置插入。矩阵大小为4 x 4。我有这个:

代码语言:javascript
运行
复制
insertRandomNumber :: RandomGen g => [[Int]] -> g -> ([[Int]], g)
insertRandomNumber mat g =
    let (pos,_) = randomR (1,16) g
        ok = free (pos `div` 4) (pos `mod` 4) mat
    in if ok == True 
       then newmatrix pos mat 
       else insertRandomNumber mat g

问题是,如果第一个位置不是空闲的,我的程序就会阻塞在其他位置。我希望你能给我一个例子,如何使用随机数插入一个随机数到一个自由的随机位置。

EN

回答 2

Stack Overflow用户

发布于 2014-04-28 07:54:33

您需要保留新的随机数生成器并传递该生成器,而不是旧的生成器。如果做不到这一点,则意味着您将始终在每次迭代和循环中生成相同的pos

在代码中:

代码语言:javascript
运行
复制
let (pos,_) = randomR (1,16) g

在这里,您显式地忽略了新的RNG状态。而是:

代码语言:javascript
运行
复制
let (pos,newGen) = randomR (1,16) g

然后传递旧的生成器,它将生成完全相同的pos

代码语言:javascript
运行
复制
in if ok == True then newmatrix pos mat else insertRandomNumber mat g

相反,您应该传递新的生成器状态:

代码语言:javascript
运行
复制
in if ok == True then newmatrix pos mat else insertRandomNumber mat newGen
票数 2
EN

Stack Overflow用户

发布于 2014-04-28 08:24:07

您可以将这个问题分成三个部分:枚举所有包含0的索引,从中挑选一个随机索引,并在选定的索引处插入一个随机数。所以就像这样:

代码语言:javascript
运行
复制
insertRandomNumber :: RandomGen g => [[Int]] -> g -> ([[Int]], g)
insertRandomNumber mat g0 = case validPositions mat of 
                             [] -> (mat, g0)
                             xs -> let (i,g1)  = randomR (0, length xs - 1) g0
                                       (v, g2) = randomR (1,100 :: Int) g1 
                                    in (replaceAt mat (xs !! i) v, g2)

我将留给您编写函数validPositionsreplaceAt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23330368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档