簡體   English   中英

如何編寫隨機乘數選擇函數?

[英]How to write a random multiplier selection function?

我正在嘗試編寫一個函數,該函數返回隨機選擇的以下乘數之一,但遵循頻率要求。 下表定義的是,對於此函數的 100 萬次調用,1500 將返回一次,500 將返回兩次,依此類推。

|---------------------|------------------------------|
|      Multiplier     |     Frequency Per Million    |
|---------------------|------------------------------|
|          1500       |         1                    |
|---------------------|------------------------------|
|          500        |         2                    |
|---------------------|------------------------------|
|          200        |         50                   |
|---------------------|------------------------------|
|          50         |         100                  |
|---------------------|------------------------------|
|          25         |         20,000               |
|---------------------|------------------------------|
|          5          |         75,000               |
|---------------------|------------------------------|
|          3          |         414,326              |
|---------------------|------------------------------|
|          2          |         490521               |
|---------------------|------------------------------|

想知道實現這一點的最佳方法是什么。

如果設置了需要返回的頻率和值,那么就不需要什么復雜的了。 您只需要通過添加先前數字的頻率來調整 if 塊中正在處理的先前數字。

private int GetRandomMultiplier()
{
  var random = new Random();
  var next = random.Next(1000000);
  if (next < 1)
  {
      return 1500;
  }
  else if (next < 3)
  {
      return 500;
  }
  else if (next < 53)
  {
      return 200;
  }
  else if (next < 153)
  {
      return 50;
  }
  else if (next < 20153)
  {
      return 25;
  }
  else if (next < 95153)
  {
      return 5;
  }
  else if (next < 509479)
  {
      return 3;
  }

  return 2;
}

你不想每次都創建一個新的Random ,所以創建一個並使用它。

首先,讓我們聲明模型:

 static Dictionary<int, int> multipliers = new Dictionary<int, int>() {
   {1500,       1},
   { 500,       2},
   { 200,      50},
   {  50,     100},
   {  25,  20_000},
   {   5,  75_000},
   {   3, 414_326},
   {   2, 490_521}, 
 };

然后您可以輕松選擇隨機乘數:

 // Easiest, but not thread safe
 static Random random = new Random();

 ...

 private static int RandomMultiplier() {
   int r = random.Next(multipliers.Values.Sum());

   s = 0;

   foreach (var pair in multipliers.OrderByDescending(p => p.Key)) 
     if (r < (s += pair.Value)) 
       return pair.Key;

   throw new InvalidOperationException($"{r} must not reach this line");
}   
        
...

int multiplier = RandomMultiplier();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM