迭代数字样本空间的算法

Cat*_*hwa 7 language-agnostic iteration algorithm numbers

我希望这不是一个骗局,但很难将问题归结为关键词!

这总是我想知道的事情.假设你有一个黑盒子,它以n个整数作为输入(其中n > 1).鉴于整数值存在界限,您将如何编写将整个样本空间推入黑盒的算法?(如果可以在运行时指定n,则可获得奖励积分)

我在n = 2 时的尝试如下:

int min = 0;
int max = 9;
int a = min;
int b = min;

while(a <= max && b <= max)
{
  blackBox(a, b);
  a++;
  if(a > max)
  {
    a = min;
    b++;
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于两个变量,但正如你可能猜到的那样,当n接近两位数时,我的算法变得非常难看.

除了像我这样的陈述之外,还有更好的方法来做除了嵌套吗?

我知道这样做的一种不好的方法,就是随机生成每次迭代的值并保存先前迭代的输入,这样你就不会用相同的变量两次戳黑框.但是,我希望有一个更快速的方法,因为碰撞真的会影响执行时间,因为独特的黑盒子调用的数量接近(max - min + 1)^ n

DMA*_*361 6

为什么不使用嵌套循环?然后根据需要添加更多嵌套循环.

可能不会过于高效,但你确实表明你需要覆盖整个样本空间,所以你将不得不运行输入变量值的所有可能组合 - 所以我怀疑除了它之外你还能做很多关于效率的事情.可能只评估状态空间的一部分.

int min = 0;
int max = 9;
for( int a = min ; a <= max ; ++a )
    for( int b = min ; b <= max ; ++b )
        blackBox( a , b );
Run Code Online (Sandbox Code Playgroud)

另外,我认为你会发现唯一的通话数量(max - min + 1) ^ n,而不是相反.

编辑:

与已建议的不同的运行时版本

对于使用与您的问题相同的语言类型的实时版本(类似于C的东西),Imre L似乎已经敲定了头部,但是因为您已将此标记为语言不可知,所以我决定尝试不同的东西(另外,我现在正在学习Python,所以正在寻找练习的借口).

这是一个Python实时版本,在每种情况下x都会是一个n元组,比如[1,0,3,2].我唯一要说的是它包括max在状态空间中(在下面的例子中它将使用0到2,包括0和2),所以你必须max在使用前增加.

import itertools 

min = 0
max = 3
n = 4

for x in itertools.product(range(min,max), repeat=n):
        blackBox( x )
Run Code Online (Sandbox Code Playgroud)