我遇到了以下无法解决的问题。 假设我有100个bool的数组,都是假的。 我有一个数字N< 100我希望将这些布尔值的N切换为真,但是它们看起来尽可能间隔。 当N除以100时,这显然很简单,但是如果N = 53,如何做到这一点? 我天真地尝试过:
for(int i =0; i<53; ++i)
std::cout << i*100/53 <<'\n';
获得53个equaly分布的整数,在这种情况下,我实际上已经区分了整数,但我不确定这总是有效。关于这个的任何指示?
答案 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开始),在数组中放置一个数字。
数组中的数字将完全尽可能均匀分布。