2014-03-06 23 views
1

我有一个问题,我真的不知道是否有可能实现它。这是情况;我有五种方法和一个按钮。其实如果我想调用的方法轻点按钮我写:在Android中调用随机方法

btnore.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      //i call the method I need 
      Met_one(); 
     } 
    }); 

我需要的是做这样的事情:

btnore.setOnClickListener(new View.OnClickListener() { 
    @Override 
     public void onClick(View arg0) { 
      // a random function call the methods. 
      Random = random of the methods(Met_one,  Met_two,Met_three,Met_four,Met_five) 
     } 
    }); 

因此,在这样的时候我轻点按钮有时却有种行动,有时是另一个随机。这可能吗?

+1

一种简单的方法内会从1产生一个随机数到5,然后在switch语句你执行一种方法或另一种,根据该随机数你得到。 –

+0

@上面评论中的ClaudioRedi显而易见的解决方案将吸引一些复制猫的答案 - 选择谢尔盖的:) – 323go

+0

你能给我看一个例子吗? O se sei italiano,potresti postare un esempio? :-) –

回答

5

我认为最好的办法是使用交换机随机数

事情是这样的:

Random random = new Random(); 
int numberOfMethods = 4; 

switch(random.nextInt(numberOfMethods)) { 
    case 0: 
      method1(); 
      break; 
    case 1: 
      method2(); 
      break; 
    case 2: 
      method3(); 
      break; 
    case 3: 
      method4(); 
      break; 
    default: 
    method1(); 
} 
+0

这是完美的我认为..我会尝试:-)谢谢 –

+0

而不是'nextInt()%numberOfMethods'只使用'nextInt(numberOfMethods)' – 323go

+0

为什么要提供默认值?或者,为什么不是'案例3:'实际上'默认'? – Paul

0

是的,这是可能的。如果你有固定数量的方法,概率将是1/n。例如,用5表示概率是0.2。你可以有这样的事情,在这里兰特重新生成的每个按钮被点击时:

if (rand < 0.2) 
    Met_one() 
else if (rand < 0.4) 
    Met_two() 
else if (rand < 0.6) 
    Met_three() 
... etc 
+0

什么我们兰特? –

+0

rand是您在0到1之间生成的随机数。请检查Java中的Math.random()。不必介于0到1之间,例如0到100之间。如果你有两个函数,在50%的时间内你会去met_one(); met_two为50%。如果你有三个,你会在33%的时间里去看每一个,等等。 – Hajjat

+1

@ 323go:我确定这个语气没有必要。你能否详细说明为什么在你看来这太可怕了? –

1

在java中Math.random() * 5这将在[0,5]。当你按下按钮,你可以调用它的范围返回一个值。

onCreate

Button btn1=(Button)findViewById(R.id.button1); 
btn1.setOnClickListener(btnOnClickListener); 

Button.OnClickListener btnOnClickListener=new Button.OnClickListener() 
    { 

    @Override 
    public void onClick(View v) { 

      if(v==b1) 
{ 
// your Math.random() * 5 function can invoke. 
} 

    }