【问题标题】:is there a c# equivalent of pythons itertools.combinations_with_replacement是否有与 pythons itertools.combinations_with_replacement 等效的 c#
【发布时间】:2016-08-02 12:05:05
【问题描述】:

我正在寻找所有可能的掷 5 个六面骰子的方法。我知道在 python 中你可以使用 itertools 来做到这一点,在 c# 中有什么东西可以实现同样的效果吗?

itertools.combinations_with_replacement(iterable, r)

for i in itertools.combinations_with_replacement(range(1, 6), 5)

https://docs.python.org/dev/library/itertools.html#itertools.combinations_with_replacement

范围 1, 6 是骰子上的面数, , 5 是掷骰子的数量。想要制作所有可以掷骰子的 7776 种方式。例如初始滚动可能如下所示:

骰子 1、骰子 2、骰子 3、骰子 4、骰子 5 = 1,2,3,4,5

【问题讨论】:

  • 请显示您的输入和预期输出 - 您还可以包含您尝试在 c# 中重现的相关 python。
  • 因为你需要所有可能的组合,或者组合的数量?
  • 所以如果我理解正确(而且我的 python 不是很好)range(1,6) 会给你一个包含[1,2,3,4,5,6] 的集合和传递给combinations_with_replacementcombinations_with_replacement 的额外参数说你想要所有5个值的组合 - 比如123452345613456等? (如果我是对的,那么您的问题中没有类似的描述!!)
  • 已将此添加到问题中
  • 对,所以你想要所有的方式组合来掷 5 个骰子 - 明白了。

标签: c# itertools


【解决方案1】:

这很简单——它基本上是一个cross join,介于 1-6 5 次之间。

var range = Enumerable.Range(1,6);
var result = from d1 in range
                     from d2 in range
                     from d3 in range
                     from d4 in range
                     from d5 in range
            select new { d1,d2,d3,d4,d5 };

现场示例:http://rextester.com/VKA17045

【讨论】:

  • 这可能是另一个问题,但这适用于范围 1、6 和 5 的骰子,但尝试了一些较大的数字,程序似乎挂起。有没有办法使这种规模或组合的数量变得太大?
  • @danny 可能太大了。您正在尝试什么范围/组合计数?
  • 我用 20 个骰子尝试了 1、12 面。
  • @danny - 如果 5d6 表示为 6^5 组合 (7776),那么 20d12 将给出 12^20 组合。这是一个非常大的数字。您将需要一台超级计算机来计算所有组合。
  • 准确地说是 3.8x10^21 个组合(ish)@danny(或者大约是宇宙中原子数量的四分之一,用于比较)
【解决方案2】:

3615 建议的实施:

Random root = new Random();
List<int> results = new List<int>()
for (int i = 0; i < 5; i++)
{
    results.Add(root.Next(1, 6));
}

//results now contain the 5 dice throws

【讨论】:

  • 我不明白这是如何回答这个问题的。您将获得 1-6 5 次之间的随机数,并在每次迭代中丢弃结果。
  • 老实说,我对这个答案有点懒惰,你是对的。答案被扔掉了。只是认为它会给出做什么的大方向。
猜你喜欢
  • 2022-01-09
  • 2021-04-30
  • 2017-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 2010-12-23
相关资源
最近更新 更多