根据权重做随机选择的算法

1、随机选择算法。
在这里插入图片描述

要求是根据不同的权重值随机出现对应的气泡。
思路:
将所有的权重值相加,形成一个整体的区间[W1,W2],将每个权重都划分为小到子区间[w1,w2]。 每次做随机选择时,在整体的大区间[W1,W2]中随机选择一个数 s。查看s是在哪个子区间中就出现对应的气泡物体。
在这里插入图片描述

实现:(typeScript)

// 每一个东西的权重值,这里使用的数值来存储的
 const DreamType = [
    {
        name:"dianzan",
        type:"GoodDream",
        value:150,
        weight:1,
    },{
        name:"kaoshenghao",
        type:"GoodDream",
        value:100,
        weight:3,
    },{
        name:"dangao",
        type:"GoodDream",
        value:100,
        weight:3
    },{
        name:"lianggao",
        type:"GoodDream",
        value:50,
        weight:5,
    },{
        name:"kele",
        type:"GoodDream",
        value:20,
        weight:10,
    },{
        name:"zhawu",
        type:"BadDream",
        value:-50,
        weight:8
    },{
        name:"meiqiguan",
        type:"BadDream",
        value:-80,
        weight:4,
    },{
        name:"shaojiaodejianbing",
        type:"BadDream",
        weight:2,
        value:-100,
    }
]

// 随机位置
  /**
   *
   * @param arr 整个美梦泡泡配置数组
   * @param curIndex 当前截取的长度
   * @returns 返回当前长度内中weight的数值
   */

  //  获取数值
  private _getWeight(
    arr: Array<{ name: string; type: string; value: number; weight: number }>,
    curIndex: number
  ): number {
    if (arr.length <= curIndex) {
      throw new Error(
        "出入数值大于了当前的数值" + curIndex + "----arr.length:" + arr.length
      );
    }
    let weights: number = 0;
    arr.slice(0, curIndex + 1).forEach((item) => {
      weights += item.weight;
    });
    return weights;
  }




 private _createDreamBubbles(): void {
    let allWeight: number;
    allWeight = this._getWeight(DreamType, DreamType.length - 1);   //总的区间
    let num = Math.round(Math.random() * allWeight);   //生成随机数
    if (num >= allWeight - this._getWeight(DreamType, i)) {   //以此查找区间
                    // TODO .... 这里就选着出来了
      }

  }

以上代码是有些案列。

在C#中,带权重随机选择通常涉及到概率分布和随机数生成。一个常见的方法是使用`System.Collections.Generic.Dictionary<TKey, TValue>`或者`Dictionary<T, double>`来存储元素及其对应的权重,然后利用这些权重来计算每个元素被选中的概率。这里有一个简单的概念实现: ```csharp using System; using System.Collections.Generic; using System.Linq; class WeightedRandomSelection { private readonly Dictionary<int, double> weights; public WeightedRandomSelection(Dictionary<int, double> weights) { this.weights = weights; // 确保所有权重的和为1(或接近于1),以便进行正确的概率计算 double totalWeight = weights.Values.Sum(); if (totalWeight != 1) { weights = weights.ToDictionary(kvp => kvp.Key, kvp => kvp.Value / totalWeight); } } public int Choose() { double randomValue = Random.NextDouble(); // 0到1之间的随机浮点数 double cumulativeProbability = 0; foreach (var (key, weight) in weights) { cumulativeProbability += weight; if (randomValue <= cumulativeProbability) { return key; } } throw new InvalidOperationException("无法生成随机选择,可能是因为权重总和不为1"); } } public class Program { static void Main(string[] args) { Dictionary<int, double> selections = new Dictionary<int, double> { {1, 0.3}, {2, 0.4}, {3, 0.3} }; WeightedRandomSelection random = new WeightedRandomSelection(selections); int chosenNumber = random.Choose(); Console.WriteLine($"随机选择了数字: {chosenNumber}"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值