2012-12-08 117 views
3

我被困在如何开始编码这个。 我希望能够做到以下几点。这是一个经典的翻转硬币问题 如果我翻两倍了自带有:
T T [
五六
F T
F F
我希望能够在一个时间来创建一个结果的数组。为了更好地说明这一点,应该是这样的(我使用Java的方式):
布尔[] =的情况下新的布尔[numberOfFlips]真值表阵列

在第一时间的情况下将有:TT。
后我完成了其他计算,结果我想继续前进,现在创建案例:TF并继续运行其他计算。
有人可以指引我在正确的方向吗?我将不胜感激。 任何语言的算法都适合我。感谢您的时间! (:

+0

* “如果我翻两倍了自带有:T T T [F F五六F” *见鬼样的硬币*** ***结束呢?当我掷硬币两次时,我只得到两个结果... ;-) *编辑*:哦,你的意思是***可能的结果。 –

+0

对不起,忘了添加一些中断返回,所以它在一行中阅读 – Ceelos

+1

这真的不清楚你问的东西。你是在问如何逐步记录实际翻转的结果(或者伪随机翻转),或者在增加翻转次数的时候通过所有可能的结果? –

回答

4

有许多方法来存储在Java中的二进制数据,目前尚不清楚,你想要什么来存储。如果你想存储的N flippings所有可能的组合,那么你就需要和阵列new boolean[2^N][N]

记住。该Java有另一种语法对于提高电源。

UPDATE

下面是用于存储N翻转所有组合的代码。

从中你将会知道如何生成一个组合:从组合序数的二进制表示。看评论。

// number of flips 
    // limit it by 31 
    int N = 3; 

    // number of combinations 
    // using bitshift to power 2 
    int NN = 1<<N; 

    // array to store combinations 
    boolean flips[][] = new boolean[NN][N]; 

    // generating an array 
    // enumerating combinations 
    for(int nn=0; nn<NN; ++nn) { 

     // enumerating flips 
     for(int n=0; n<N; ++n) { 

      // using the fact that binary nn number representation 
      // is what we need 
      // using bitwise functions to get appropriate bit 
      // and converting it to boolean with == 
      flips[nn][N-n-1] = (((nn>>n) & 1)==1); 

      // this is simpler bu reversed 
      //flips[nn][n] = (((nn>>n) & 1)==1); 

     } 

    } 

    // printing an array 
    for(int nn=0; nn<NN; ++nn) { 

     System.out.print("" + nn + ": "); 

     for(int n=0; n<N; ++n) { 
      System.out.print(flips[nn][n]?"T ":"F "); 
     } 
     System.out.println(""); 
    } 
+0

是,做所有可能的组合是非常简单的,我一次只想在我的数组中完成一个结果。这就是为什么我的数组大小只等于翻转次数而不是2^N – Ceelos

+0

您示例中的数组大小应该是[4] [2],其中4是2^N,即2次翻转时的实际大小。 – Dims

1

注意您希望的输出与整数的二进制表示之间的相似性。下面是一个例子:

for(int i = 0; i < 4; ++i) { 
    boolean first = (i & 1) == 0; 
    boolean second = (i & 2) == 0; 
    System.out.println(first + "\t" + second); 
} 

打印:

true true 
false true 
true false 
false false 
1

下面是用于任何数目的翻转的作品(在合理范围内)的一般解决方案:

public class Flips { 

    static void generate(boolean[] res, int start) { 
     if (start == res.length) { 
      System.out.println(Arrays.toString(res)); 
     } else { 
      generate(res, start + 1); 
      res[start] = true; 
      generate(res, start + 1); 
      res[start] = false; 
     } 
    } 

    static void generate(int n) { 
     boolean res[] = new boolean[n]; 
     generate(res, 0); 
    } 

    public static void main(String args[]) { 
     generate(4); 
    } 
} 

它产生的组合在与您的问题中的顺序不同,但如果重要的话,修改以匹配您的订单是微不足道的。

1

使用递归:

public static void main(String args[]) { 
int size = 3; 
generateTable(0, size, new int[size]); 
} 

private static void generateTable(int index, int size, int[] current) { 
if(index == size) { 
    for(int i = 0; i < size; i++) { 
     System.out.print(current[i] + " "); 
    } 
    System.out.println(); 
} else { 
    for(int i = 0; i < 2; i++) { 
     current[index] = i; 
     generateTable(index + 1, size, current); 
    } 
} 
}