【问题标题】:Pick random numbers from List based on specified condition C#根据指定条件从列表中选择随机数 C#
【发布时间】:2018-06-07 07:45:07
【问题描述】:

我正在尝试从列表中生成一个唯一的随机数。在这里用户将输入以下内容:

  1. 所需的随机数个数
  2. 编号 C1、C2 和 C3 项目。

示例: 10 个具有 C1-5、C2-4 和 C3-1 的随机数。

因此需要根据这些条件生成一个随机数列表。

我的列表是这样的

1个C1 2 C2 3 C3 4 C3 5 C2 6 C1 7 C2 8 C3 9 C1 10 C2 11 C1 12 C3 13 C3 14 C1 15 C2 16 C2 17 C4 18 C3 19 C4 20 C4 21 C4 22 C1 23 C2 24 C3 25 C4 26 C3 27 C4

我的代码如下所示:

protected void BtnGenerate_Click(object sender, EventArgs e)
{
            List<string> labels; // Holds all Labels (unique)
            List<string> values; // Holds all numbers of labels
            Random r = new Random();
            StringBuilder sb=new StringBuilder(100);

            sb.Clear();
            var randoms = values.OrderBy(x => r.Next()).Take(Convert.ToInt16(txtNumberOfRandomNumbers.Text));
            foreach (var item in randoms)
            {
                sb.Append(item.ToString() + ",");
            }

            lblRandomNumbers.Text = sb.ToString().Remove(sb.ToString().LastIndexOf(","));
}

我不知道如何将这些条件添加到 Random 函数。请帮我解决这个问题。

【问题讨论】:

  • 使用随机循环法..

标签: c# arrays random unique


【解决方案1】:

我建议生成所需的项目,然后改组集合,例如:

// Simplest, but not thread safe
static Random s_Gen = new Random();

private static string Solution(int all, int c1, int c2, int c3) {
  return string.Join(",", new[] {
    Enumerable.Repeat("C1", c1),
    Enumerable.Repeat("C2", c2),
    Enumerable.Repeat("C3", c3),
    Enumerable.Repeat("C4", all - c1 - c2 - c3), }
  .SelectMany(item => item)
  .OrderBy(item => s_Gen.NextDouble()));  
}

protected void BtnGenerate_Click(object sender, EventArgs e) {
  lblRandomNumbers.Text = Solution(27, 10, 5, 3);
}

【讨论】:

  • 我喜欢简单地返回本地字符串而不是 Linq 查询,以便可以在方法内部进行 E&C 调试,而不必调用它来获得结果。除了变量的额外开销之外,还有什么原因让您更喜欢直接返回?
  • @Jeremy Thompson:我明白了,在很多情况下,您的建议 var data = /*... linq ...*/; return string.Join(",", data);可读并且更易于维护/调试。但是,查询本身非常简单(实际上重要的是 OrderBy),这就是为什么我认为我有权将 Linq 和 Join 合二为一
【解决方案2】:

尝试以下:

List<string> input = new string[] { "C1", "C1", "C1", "C1", "C1", "C1", "C2", "C2", "C2", "C2", "C2", "C2", "C2", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C4", "C4", "C4", "C4", "C4", "C4" }.ToList();

Random rand = new Random();

List<string> output = input.Select(x => new { number = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.number).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多