我正在尝试编写一个 TypeScript 函数来打乱数组。
默认情况下,我希望洗牌顺序是随机的(但受种子影响)。(我已经可以使用这个功能了function random(seed: number): number:)
但是,我还想允许通过每个项目的重量来影响订单。
换句话说,我希望默认项目权重为 1,如果一个项目的权重为 10,那么它在打乱顺序中较早出现的可能性应该增加 10 倍。
我是否正确地思考过这个问题?这是一个合理的目标吗?
我认为我需要使用 Fisher-Yates 算法,但适应于与主数组长度相同的权重数组,并且主数组将被洗牌,以便较高权重的项目更有可能首先出现。
function removeDuplicates<T>(array: T[]): T[] {
const uniqueValues = new Set<T>();
return array.filter((item) => {
if (!uniqueValues.has(item)) {
uniqueValues.add(item);
return true;
}
return false;
});
}
function duplicateItemsBasedOnWeights<T>(array: T[], weights: number[]): T[] {
const result = [];
for (const [index, element] of array.entries()) {
for (let position = 0; position < weights[index]; position++) {
result.push(element);
}
}
return result;
}
export function …Run Code Online (Sandbox Code Playgroud) 使用嵌套数组中的权重对一个或多个数组进行混洗的好算法是什么?
例子:
$array = array(
array("name"=>"John", "rank"=>3),
array("name"=>"Bob", "rank"=>1),
array("name"=>"Todd", "rank"=>8),
array("name"=>"Todd", "rank"=>14),
array("name"=>"Todd", "rank"=>4)
);
Run Code Online (Sandbox Code Playgroud)
我希望数组随机打乱,但我希望该rank值是一个权重。因此,那些数字排名较低的人更有可能位于列表的顶部。
我已经尝试了一些事情,比如遍历数组并提取使用的数组,mt_rand(mt_rand(0,$value),$value)但我认为我没有走在正确的轨道上......
例如,我有这些数据:
headings = {
:heading1 => { :weight => 60, :show_count => 0}
:heading2 => { :weight => 10, :show_count => 0}
:heading3 => { :weight => 20, :show_count => 0}
:heading4 => { :weight => 10, :show_count => 0}
}
total_views = 0
Run Code Online (Sandbox Code Playgroud)
现在我想根据他们的体重为每个标题服务.例如,对于第一个10请求/迭代heading1,heading3,heading2和heading4将分别在顺序(按重量计)提供服务6,2,1,和1次.
对于每次迭代,服务标题的show_count将递增1,total_views也将全局递增.
你可以建议一个算法或一些红宝石代码来处理这个问题.