如何在一系列M bool中分配N个规则间隔的bool?

时间:2012-01-26 22:40:01

标签: c++ algorithm

我遇到了以下无法解决的问题。 假设我有100个bool的数组,都是假的。 我有一个数字N< 100我希望将这些布尔值的N切换为真,但是它们看起来尽可能间隔。 当N除以100时,这显然很简单,但是如果N = 53,如何做到这一点? 我天真地尝试过:

for(int i =0; i<53; ++i)
    std::cout << i*100/53 <<'\n';

获得53个equaly分布的整数,在这种情况下,我实际上已经区分了整数,但我不确定这总是有效。关于这个的任何指示?

3 个答案:

答案 0 :(得分:1)

对于你建议的方法,只要X <1,你就会得到i * 100 / X和(i + 1)* 100 / X的不同整数。 100(因为差异是100 / X,其> 1)。所以这是一个简单的归纳证明,你用这种方式得到的所有整数都是唯一的。

所以这是一个很好的方法。唯一可以回答的真正问题是如何定义均匀分布的整数?

也许对于X&gt; 2,你应该总是将i [0]和i [99]设置为true并将空间平均分配。对于X = 1的特殊情况,将中间元素(第50或第51个)设置为true。

答案 1 :(得分:0)

这是C#,但也许是这样的?

    static void Main( string[] args ) {

        bool[] bools = new bool[100];

        decimal incrementor = 100m / 53;
        decimal tracking = 0;
        for( int i = 0; i < 52; i++ ) {
            tracking += incrementor;
            bools[(int) Math.Round(tracking)] = true;
        }
    }

答案 2 :(得分:0)

找到最大数字P,小于或等于N,其中P是M的除数。

P为增量(从索引0开始),在数组中放置一个数字。

数组中的数字将完全尽可能均匀分布。