Java 调用随机函数
我想在main中随机调用GetRandomFunc(),直到每个函数调用一次,然后结束。如何确保函数只被调用一次,而不被再次调用。将值存储在集合中,然后随机抽取值,直到集合为空,这样会更容易。或者更好的办法是,洗牌收集,然后按顺序浏览 集合中的值可以是整数,也可以是不同类(具有公共超类或接口)的对象,它们提供了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
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调用它,但它只调用第一个函数,然后停止。