- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据 cppreference.com std::discrete_distribution
接口(interface)需要库开发人员实现 probabilities()
和 template<class Generator> result_type operator()(Generator& g, const param_type& params);
.后者未记录在 cppreference.com 上,但根据 libc++ implementation它允许用户从给定权重序列的子序列中采样(并使用传递的生成器作为另一个生成器的熵源,但它现在不相关)。我读过 N3551 (关于 std::discrete_distribution
的唯一 googleable 提案)并且它没有为 std::discrete_distribution
提供这样一个接口(interface)的任何理由。 .
问题是这样的接口(interface)只允许一个合理的实现,称为"roulette wheel selection" (需要一次调用随机数生成器和 O(log(N))
二进制搜索的数组查找)。另一种算法,称为 "alias method" (需要两次调用随机数生成器和一次数组查找)不能用于实现此接口(interface)(好吧,probabilities()
可以实现,如果我们将相应的概率存储在一个单独的数组中,但它有点不公平且效率低下: ), 因为如果我们需要从子序列中采样,就不能使用别名方法。
最佳答案
对于为给定随机分布构造参数对象的成本及其内部表示的性质没有要求。或其他任何东西。特别是,parameters 对象不必而且通常不会只是其构造参数的向量。构造参数对象必须执行任何必要的预计算/预处理,以使以后的分布生成高效。 (这不仅适用于 discrete_distribution
。有许多分布的自然参数需要非平凡成本的预计算步骤。)
为了实现“轮盘赌”算法,参数对象构造函数必须将参数转换为累积分布函数 (CDF)。但是,该参数对象不会有用,因为正如您所说,它预计每次调用的执行时间为 O(log n),而标准要求分摊 O(1)。可以使用另一种随机算法来代替,它具有随机 O(1) 时间,我认为这是合格的;它还需要对参数进行 O(n) 的预处理步骤才能提取最大值。
别名方法在我看来是最优的,需要更复杂的 O(n) 预处理步骤,但正如我之前所说,对参数对象的构造成本没有要求。 (计算出的别名概率对象的大小也是 O(n);我使用的实现将 n 取整为 2 的幂,所以它的最坏情况大小小于 32n 字节。我没有看过任何标准库实现。)
顺便说一句,别名方法不需要两次 PRNG 调用。用一个来实现它是很常见的:给定 n 个可能的结果,你将 PRNG 的范围分成 n 个离散的部分(这就是为什么我将 n 向上取整为 2 的幂);每件的阈值基于原始随机数。如果使用取模运算符划分为离散部分,则阈值与可能的随机数的整个范围成正比;如果按范围划分,则阈值与框的大小成正比,并由框的原点偏移。无论哪种方式,都使用相同的随机数来选择一个框,然后选择两个别名之一,生成函数大致包括:
auto r = prng();
size_t b = box_select(r);
return r > threshold[b] ? alias1[b] : alias2[b];
这不仅仅是摊销 O(1);它是 O(1)。所以它满足所有要求。
关于algorithm - std::discrete_distribution 接口(interface)背后的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34619304/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!