Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用随机函数_Java_Function_Switch Statement_Main_Random Access - Fatal编程技术网

Java 调用随机函数

Java 调用随机函数,java,function,switch-statement,main,random-access,Java,Function,Switch Statement,Main,Random Access,我想在main中随机调用GetRandomFunc(),直到每个函数调用一次,然后结束。如何确保函数只被调用一次,而不被再次调用。将值存储在集合中,然后随机抽取值,直到集合为空,这样会更容易。或者更好的办法是,洗牌收集,然后按顺序浏览 集合中的值可以是整数,也可以是不同类(具有公共超类或接口)的对象,它们提供了call()方法的不同实现 例如: public static GetRandomFunc() { switch((int)(Math.random()*NUM_FUNCTIONS

我想在main中随机调用GetRandomFunc(),直到每个函数调用一次,然后结束。如何确保函数只被调用一次,而不被再次调用。

将值存储在集合中,然后随机抽取值,直到集合为空,这样会更容易。或者更好的办法是,洗牌收集,然后按顺序浏览

集合中的值可以是整数,也可以是不同类(具有公共超类或接口)的对象,它们提供了
call()
方法的不同实现

例如:

public static GetRandomFunc() {
    switch((int)(Math.random()*NUM_FUNCTIONS)  {
        case 0:
            functionA();
            break;
        case 1:
            functionB();
            break;
        case 2:
            functionC();
            break;
          //  ...
    }
}
import java.util.*;
import java.util.concurrent.*;

List<Runnable> functions = new ArrayList<Runnable>();
functions.add(new Runnable() {
  public void run() { /* do something */ }
});
functions.add(new Runnable() {
  public void run() { /* do something else */ }
});

Collections.shuffle(functions);
for(Runnable function : functions)
  function.run();
import java.util.*;
导入java.util.concurrent.*;
列表函数=新的ArrayList();
添加(新的Runnable(){
public void run(){/*执行操作*/}
});
添加(新的Runnable(){
public void run(){/*执行其他操作*/}
});
集合。洗牌(函数);
for(可运行函数:函数)
函数run();

此线程上的其他帖子显示了其他可能的解决方案,但它们都比此线程更复杂,更容易出错,如果函数数量很大,大多数都会非常慢。(来自@AndersInden的是一个例外——即使有数千个函数要调用,它仍然会很快。)

将值存储在集合中,然后随机抽取值,直到集合为空,这样会更容易。或者更好的办法是,洗牌收集,然后按顺序浏览

集合中的值可以是整数,也可以是不同类(具有公共超类或接口)的对象,它们提供了
call()
方法的不同实现

例如:

public static GetRandomFunc() {
    switch((int)(Math.random()*NUM_FUNCTIONS)  {
        case 0:
            functionA();
            break;
        case 1:
            functionB();
            break;
        case 2:
            functionC();
            break;
          //  ...
    }
}
import java.util.*;
import java.util.concurrent.*;

List<Runnable> functions = new ArrayList<Runnable>();
functions.add(new Runnable() {
  public void run() { /* do something */ }
});
functions.add(new Runnable() {
  public void run() { /* do something else */ }
});

Collections.shuffle(functions);
for(Runnable function : functions)
  function.run();
import java.util.*;
导入java.util.concurrent.*;
列表函数=新的ArrayList();
添加(新的Runnable(){
public void run(){/*执行操作*/}
});
添加(新的Runnable(){
public void run(){/*执行其他操作*/}
});
集合。洗牌(函数);
for(可运行函数:函数)
函数run();

此线程上的其他帖子显示了其他可能的解决方案,但它们都比此线程更复杂,更容易出错,如果函数数量很大,大多数都会非常慢。(来自@AndersInden的是一个例外——即使有数千个函数要调用,它仍然会很快。)

位字段记录函数是否已被调用,以及
if
语句,如果函数的位已设置,则不调用该函数-保持循环,直到所有位都设置完毕

(或者如Alex D所说,创建一个数字集合,以便提前使用)


无论采用哪种方法,诀窍都是确保生成每个数字一次且仅生成一次-如果您将此位弄错,则最终可能会进入无限循环(例如,等待获取数字1、2和3,但您的随机函数正在生成0、1和2)

记录函数是否已被调用的位字段,以及记录已设置位时不调用函数的
if
语句-保持循环,直到所有位都已设置

(或者如Alex D所说,创建一个数字集合,以便提前使用)


无论哪种方法,诀窍都是确保生成每个数字一次且只生成一次-如果你把这一位弄错了,你可能会进入一个无限循环(例如,等待得到数字1、2和3,但你的随机函数正在生成0、1和2)

你可以创建一个数组来跟踪哪些函数已经被使用过

例如:

public static GetRandomFunc() {
    switch((int)(Math.random()*NUM_FUNCTIONS)  {
        case 0:
            functionA();
            break;
        case 1:
            functionB();
            break;
        case 2:
            functionC();
            break;
          //  ...
    }
}
import java.util.*;
import java.util.concurrent.*;

List<Runnable> functions = new ArrayList<Runnable>();
functions.add(new Runnable() {
  public void run() { /* do something */ }
});
functions.add(new Runnable() {
  public void run() { /* do something else */ }
});

Collections.shuffle(functions);
for(Runnable function : functions)
  function.run();

然后,您只需重复调用GetRandomFunc(),直到usedFunctions中的所有元素都为true。

您可以创建一个数组来跟踪哪些函数已经被使用过

例如:

public static GetRandomFunc() {
    switch((int)(Math.random()*NUM_FUNCTIONS)  {
        case 0:
            functionA();
            break;
        case 1:
            functionB();
            break;
        case 2:
            functionC();
            break;
          //  ...
    }
}
import java.util.*;
import java.util.concurrent.*;

List<Runnable> functions = new ArrayList<Runnable>();
functions.add(new Runnable() {
  public void run() { /* do something */ }
});
functions.add(new Runnable() {
  public void run() { /* do something else */ }
});

Collections.shuffle(functions);
for(Runnable function : functions)
  function.run();

然后,您只需重复调用GetRandomFunc(),直到usedFunctions中的所有元素都为true。

保留一个整数数组,告诉您哪些索引尚未使用。 使用整数后,使用列表中的最后一个索引将其填充到孔中,并将其视为一个短一项的列表

boolean[] usedFunctions = new boolean[NUM_FUNCTIONS];

public static GetRandomFunc() {
    switch((int) (Math.random() * NUM_FUNCTIONS) {
        case 0:
            if(!usedFunctions[0]) {
                functionA();
                usedFunctions[0] = true;
            }
            break;
        case 1:
            if(!usedFunctions[1]) {
                functionB();
                usedFunctions[1] = true;
            }
            break;
        // etc.
     }
}
int索引[]=newint[3];
对于(int i=0;i<3;i++)
指数[i]=i;
对于(int i=0;i<3;i++)
{
int索引=(int)(Math.random()*(3-i));
开关(索引[索引])
{
案例0:
functional();
打破
案例1:
函数b();
打破
案例2:
函数c();
打破
}
索引[索引]=索引[2-i];
}

您保留一个整数数组,告诉您哪些索引尚未使用。 使用整数后,使用列表中的最后一个索引将其填充到孔中,并将其视为一个短一项的列表

boolean[] usedFunctions = new boolean[NUM_FUNCTIONS];

public static GetRandomFunc() {
    switch((int) (Math.random() * NUM_FUNCTIONS) {
        case 0:
            if(!usedFunctions[0]) {
                functionA();
                usedFunctions[0] = true;
            }
            break;
        case 1:
            if(!usedFunctions[1]) {
                functionB();
                usedFunctions[1] = true;
            }
            break;
        // etc.
     }
}
int索引[]=newint[3];
对于(int i=0;i<3;i++)
指数[i]=i;
对于(int i=0;i<3;i++)
{
int索引=(int)(Math.random()*(3-i));
开关(索引[索引])
{
案例0:
functional();
打破
案例1:
函数b();
打破
案例2:
函数c();
打破
}
索引[索引]=索引[2-i];
}

Hi,您能告诉我如何使用集合中的函数吗?Hi,您能告诉我如何使用集合中的函数吗?Hi,它只调用一次。我试着从main调用它,但它只调用第一个函数,然后停止。嗨,它只调用了一次。我尝试从main调用它,但它只调用第一个函数,然后停止。