根据这个Boost文档页面,Mersenne Twister的64位变体比它的32位变体慢得多(这很有意义).据我了解,C++ 11中引入的许多功能,包括随机数生成,在标准库中基本上都是Boost.这让我相信标准C++中的32位MT性能也更好.
我正在写一个光线跟踪器(主要是为了好玩),速度是我最关心的问题之一.基本上所有数值都表示为双精度浮点数.我的问题是,由于32位MT速度要快得多,我可以用它来生成双打吗?我可以期待哪些缺点(精度损失,性能等)?
出于教育目的,我最近在Haskell中实现了通用算法.目前我被困在广度优先搜索上.这是我的实现,为简单起见,节点只表示为整数:
import qualified Data.Map as M
import qualified Data.List as L
type Node = Int
type Graph = M.Map Node [Node]
-- Returns list of nodes adjacent to n in graph g
adjacent :: Node -> Graph -> [Node]
adjacent n g = M.findWithDefault [] n g
-- Returns graph g with all instances of n removed
rip :: Node -> Graph -> Graph
rip n g = M.delete n (M.map (L.delete n) g)
bfs :: Node -> Graph -> …Run Code Online (Sandbox Code Playgroud) 是否有一种简单有效的方法可以在三维空间中"悬挂"磁盘上生成随机(均匀分布)点?磁盘由其正常定义.
理想情况下,我想避免旋转矩阵,因为我不完全理解它们,我知道它们有问题.
到目前为止,我已经尝试生成一个3D单位矢量并将其投影到磁盘平面上,这确保了点在磁盘内,但不是它均匀分布.我还尝试根据其长度的某些函数来缩放生成的向量,但无论如何我都无法获得均匀分布.
我有一个想法,涉及创建彼此垂直的2个向量和法线,以定义局部坐标系.然后,我可以像在2D中一样在单位磁盘上生成一个点,并将结果转换回全局坐标系.这似乎是非常有效的,因为它涉及一些预计算(我完全没有)并且之后只有简单的计算(这是光线跟踪器,所以它会发生很多).问题是,我不知道如何可靠地计算局部坐标系的基矢量,同时避免可能的问题,如共线性.
任何帮助深表感谢.