2401d,d随机选择类

原文
我有一个许多类实现的接口,我想随机选择其中一个实现.还有两个约束:首先,不是均匀分布,所有类都可定义被选中的机会(反映在"weight()"函数中).而且根据运行时信息,并非所有类都可用.

我搞了个最小工作示例,但它很重(特别是因为有中间枚举),可更漂亮,更易于理解(也许用模板插件等编译时操作).
可否改进?

import std.stdio;
import std.array;
import std.algorithm;
import std.conv;
import std.random;
interface Parent
{void doWork();static int weight();static Parent from(Implem impl){final switch (impl){case Implem.IMPLEM_1:return new Implem1();case Implem.IMPLEM_2:return new Implem2();case Implem.IMPLEM_3:return new Implem3();}}
}
class Implem1 : Parent
{void doWork(){writeln("From Implem 1");}static int weight(){return 3;}
}
class Implem2 : Parent
{void doWork(){writeln("From Implem 2");}static int weight(){return 2;}
}
class Implem3 : Parent
{void doWork(){writeln("From Implem 3");}static int weight(){return 3;}
}
enum Implem
{IMPLEM_1,IMPLEM_2,IMPLEM_3
};Implem[] availableImplems()
{bool runtimeCondition = true;if (runtimeCondition)return [Implem.IMPLEM_1, Implem.IMPLEM_2];elsereturn [Implem.IMPLEM_2, Implem.IMPLEM_3];
}
int getWeight(Implem implem)
{final switch (implem){case Implem.IMPLEM_1:return Implem1.weight();case Implem.IMPLEM_2:return Implem2.weight();case Implem.IMPLEM_3:return Implem3.weight();}
}
int[] getAllWeights(in Implem[] availableImplems)
{return availableImplems.map!(implem => implem.getWeight()).array;
}
Parent drawAtRandom()
{const Implem[] available = availableImplems();const int[] weights = getAllWeights(available);const Implem drawn = available[dice(weights)];return Parent.from(drawn);
}
void main()
{Parent p = drawAtRandom();p.doWork();
}

我会用编译时枚举标记每个实现,并用带CRTP[1]编译时内省,并根据期望分布选择类来自动生成代码.
1维基CRTP
如下:

import std.stdio;
interface MyIntf {void work();
}struct ImplemInfo {int weight;MyIntf function() instantiate;
}ImplemInfo[] implems; //实现列表
int totalWeight;MyIntf chooseImplem() {import std.random;auto pick = uniform(0, totalWeight);auto slice = implems[];assert(slice.length > 0);while (slice[0].weight <= pick) {pick -= slice[0].weight;slice = slice[1 .. $];}return slice[0].instantiate();
}//使用`CRTP`在`.implems`中`自动注册`实现的`基类`,从而无需`每个子类`中的太多样板.
class Base(C) : MyIntf {//继承类必须定义一个`编译时`可读的`.weight`成员.static assert(is(typeof(C.weight) : int),"继承类必须定义.weight成员");static this() {implems ~= ImplemInfo(C.weight, () {return cast(MyIntf) new C;});totalWeight += C.weight;}//继承类必须实现它abstract void work();//..
}
//类位置
class Implem1 : Base!Implem1 {enum weight = 1;override void work() { writeln(typeof(this).stringof); }
}
class Implem2 : Base!Implem2 {enum weight = 2;override void work() { writeln(typeof(this).stringof); }
}
class Implem3 : Base!Implem3 {enum weight = 3;override void work() { writeln(typeof(this).stringof); }
}
void main() {//通过`管道`把程序输出传递给`"sort|uniq-c"`来验证是否`正确`生成了`期望分布`.foreach (_; 0 .. 100) {auto impl = chooseImplem();impl.work();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Cadence中单独添加或删除器件与修改网络的方法

首先需要在设置中使能 ,添加或修改逻辑选项。 添加或删除器件&#xff0c;点击logic-part&#xff0c;选择需要添加或删除的器件&#xff0c;这里的器件必须是PCB中已经有的器件&#xff0c;Refdes中输入添加或删除的器件标号&#xff0c;点击Add添加。 添加完成后就会显示在R1…

基于springboot智慧食堂管理系统源码和论文

随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管理&#xff0c;它将是直接管理“智慧食堂”系统的最新形式。本论文是以构建“智慧食堂”系统为目标&#xff0c;使用java技术制作&…

MATLAB中dlmread函数用法

目录 语法 说明 示例 读取整个带分隔符的文件 读取包含空的分隔字段的文件 从特定行和列偏移量开始读取带分隔符的文件 读取带分隔符的文件中的特定范围 dlmread函数的功能是将 ASCII 分隔的数值数据文件读取到矩阵。 语法 M dlmread(filename) M dlmread(filename,…

uView Calendar 日历

此组件用于单个选择日期&#xff0c;范围选择日期等&#xff0c;日历被包裹在底部弹起的容器中。 注意&#xff1a; 此组件与Picker 选择器的日期选择模式有一定的重合之处&#xff0c;区别在于本组件为更专业的日期选择场景&#xff0c;能选择日期范围等。 另外Picker组件的日…

Clickhouse SQL字符串相关

1、列表 列转行 列转行就是将某一没有重复数据的列进行转换之后变成可以与其他数据对应起来的有重复数据的列 列转行&#xff0c;将一个字段中的多值按某分隔符进行炸开&#xff0c;分为多行 arrayJoin(splitByString(&#xff0c;, cast(data_detail as String))) AS col行转…

odoo17 | 基本视图

前言 我们在上一章中已经看到Odoo能够为给定模型生成默认视图。在实践中&#xff0c;默认视图是绝对不可接受的用于商业应用程序。相反&#xff0c;我们至少应该以逻辑方式组织各种字段。 视图在带有动作和菜单的XML文件中定义。它们是ir.ui.view模型的实例。 在我们的房地产…

OpenHarmony从入门到放弃(一)

OpenHarmony从入门到放弃&#xff08;二&#xff09; 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目&#xff0c;其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…

Termius for Mac/Win:一款功能强大的终端模拟器、SSH 和 SFTP 客户端软件

随着远程工作和云技术的普及&#xff0c;对于高效安全的远程访问和管理服务器变得至关重要。Termius&#xff0c;一款强大且易用的终端模拟器、SSH 和 SFTP 客户端软件&#xff0c;正是满足这一需求的理想选择。 Termius 提供了一站式的解决方案&#xff0c;允许用户通过单一平…

什么是Alibaba Cloud Linux?完全兼容CentOS,详细介绍

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

如何修复卡在恢复模式的Android 手机并恢复丢失的数据

Android 系统恢复是一项内置功能&#xff0c;如果您的 Android 设备无法正常工作或触摸屏出现问题&#xff0c;该功能会很有帮助。您可以启动进入恢复模式并使用它来恢复出厂设置您的 Android 设备&#xff0c;而无需访问设置。此外&#xff0c;它还经常用于重新启动系统、从 A…

使用生成式AI查询大型BI表

在拥有大量表格形式数据的组织中&#xff0c;数据分析师的工作是通过提取、转换和围绕数据构建故事来理解这些数据。 分析师访问数据的主要工具是 SQL。 鉴于大型语言模型 (LLM) 令人印象深刻的功能&#xff0c;我们很自然地想知道人工智能是否可以帮助我们将信息需求转化为格式…

网站的数据是如何收集和分析的?

数据采集的方法&#xff1a; 1、API API又叫应用程序接口&#xff0c;是网站的管理者为了使用者方便&#xff0c;编写的一种程序接口。该类接口可以屏蔽网站底层复杂算法仅仅通过简单的调用即可实现对数据请求的功能。目前主流的社交媒体&#xff0c;比如微博、贴吧等均可提供…

链表--160. 相交链表/easy

160. 相交链表 1、题目2、题目分析3、解题步骤4、复杂度最优解代码示例5、抽象与扩展 1、题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向…

Rust 常用的第三方库

Rust 的标准库虽然已经很强大&#xff0c;但如果恰当地使用第三方库&#xff0c;可以大大改善编程效率。以下是一些常用的 Rust 第三方库。 tokio ---- 最通用的异步编程库&#xff0c;几乎可以说是行业标准了&#xff0c;大量的其它库依赖于tokio。reqwest ---- HTTP 客户端库…

【面试高频算法解析】算法练习4 滑动窗口

目录 前言算法解析练习题长度最小的子数组无重复字符的最长子串找到K个最接近的元素 前言 本篇章开放目的是按算法类型学习算法&#xff0c;学习对应算法理论&#xff0c;并通过练习一些经典算法题深入理解这类算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解…

Centos自定义命令循环执行脚本

一.vim创建文件 vim batch.sh 进入空文件中&#xff0c;粘贴以下内容 #!/bin/bash echo "开始执行 start" for i in {30000..32767}; do echo "正在执行第 $i 次" firewall-cmd --zonepublic --add-port$i/tcp --permanent done ESC后 :w保存…

java字符串转JSON格式

java字符串转JSON格式 package cn.tedu.test;import cn.hutool.core.map.MapUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.GsonBuilder;import ja…

编程笔记 html5cssjs 023 HTML表单属性

编程笔记 html5&css&js 023 HTML表单属性 Action 属性Target 属性Method 属性Autocomplete 属性Novalidate 属性所有 <form> 属性的列表 表单和其他HTML元素一样&#xff0c;拥有很多属性&#xff0c;不同的属性值&#xff0c;就呈现不同的表单效果或功能。本节介…

复试 || 就业day03(2024.01.03)项目一

文章目录 前言scikit-learn实现简单线性回归scikit-learn实现多元线性回归&#xff08;二元&#xff09;总结 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容来自某机构网课&#xff0c;是我为复试准备的第一个项…

基于Vue开发的一个仿京东电商购物平台系统(附源码下载)

电商购物平台项目 项目完整源码下载 基于Vue开发的一个仿京东电商购物平台系统 Build Setup # csdn下载该项目源码压缩包 解压重命名为sangpinghui_project# 进入项目目录 cd sangpinghui_project# 安装依赖 npm install# 建议不要直接使用 cnpm 安装以来&#xff0c;会有各…