用java生成非重复随机数

用java生成非重复随机数,java,Java,我正在做一个游戏,用java问不同的问题。问题存储在一些arraylist中。 我的问题是这些问题不应该重复。若所有问题都被问到了,那个么程序应该停止。我用过java随机函数。但它失败了。任何帮助都是值得的 关于如果我正确理解了您的问题,您希望以随机顺序显示问题。这个问题有一个简单的解决办法。使用方法java.util.Collections.shuffle随机排列列表中的问题。然后从头开始遍历列表。此算法具有线性时间和空间复杂性。如果我正确理解您的问题,您希望以随机顺序显示问题。这个问题有一个

我正在做一个游戏,用java问不同的问题。问题存储在一些arraylist中。 我的问题是这些问题不应该重复。若所有问题都被问到了,那个么程序应该停止。我用过java随机函数。但它失败了。任何帮助都是值得的
关于

如果我正确理解了您的问题,您希望以随机顺序显示问题。这个问题有一个简单的解决办法。使用方法
java.util.Collections.shuffle
随机排列列表中的问题。然后从头开始遍历列表。此算法具有线性时间和空间复杂性。

如果我正确理解您的问题,您希望以随机顺序显示问题。这个问题有一个简单的解决办法。使用方法
java.util.Collections.shuffle
随机排列列表中的问题。然后从头开始遍历列表。此算法具有线性时间和空间复杂度。

将问题列表复制到临时列表,然后

while(list.size() > 0){
     int i = Math.floor(Math.Random() * list.size());
     list.get(i); //do something with question
     list.remove(i);
}
只要列表中有元素,它就会循环,拉出一个随机元素,然后将其从列表中删除



编辑以澄清-这确保您不会获得重复的问题列表

将问题列表复制到临时列表中,以及

while(list.size() > 0){
     int i = Math.floor(Math.Random() * list.size());
     list.get(i); //do something with question
     list.remove(i);
}
只要列表中有元素,它就会循环,拉出一个随机元素,然后将其从列表中删除



编辑以澄清-这可确保您不会获得重复的内容

Random是如何失败的?您是否使用当前时间为其设置种子?[
shuffle()
](列表。Random是如何失败的?您是否使用当前时间为其设置种子?[
shuffle()
])(列表。但我不想在程序执行时重复任何问题。如果所有问题都出现,它应该给我一条消息,如“所有问题已完成”。您只需洗牌一次。当您到达列表末尾时->“全部完成”
shuffle
i就像洗牌一副牌。您不会得到重复。因此,从列表中获取一个问题后,我需要将其从列表中删除。然后再次洗牌该列表?我现在使用此代码公开问题GetQuestionwhichisnotbearedoftype(布尔类型){Question toReturn=新问题(0,“问题为空”,true);while(appearedQuestions.size()>0){int i=(int)Math.floor(Math.random()*appearedQuestions.size());toReturn=appearedQuestions.get(i);//对问题appearedQuestions.remove(i);}返回toReturn;}但我不想在程序执行时重复任何问题。如果出现所有问题,它会给我一条消息,如“所有问题已完成”。您只需洗牌一次。当您到达列表末尾->所有问题已完成
shuffle
i就像洗一副牌。你不会得到重复。所以在从列表中得到一个问题后,我需要将其从列表中删除。然后再次洗牌该列表?我现在使用的代码是公共问题GetQuestions,它不会被筛选为类型(布尔类型){question toReturn=新问题(0,“问题为空”,true);while(appearedQuestions.size()>0){int i=(int)Math.floor(Math.random()*appearedQuestions.size());toReturn=appearedQuestions.get(i);//对appearedQuestions.remove(i);}return toReturn;}我所要做的就是从一个数组列表中选择任意一个随机问题,并确保问题在被问完后不会被重复。你所说的方式是按照我所想的顺序进行。现在我希望我的问题对你来说是清楚的。如果有50个问题。我希望所有50个问题中的任何一个都被问出来。不管怎样可能是第一次出现第40个问题。但在提出问题后,不应重复。所有50个问题都应随机提问。这正是此代码所做的,您生成一个介于0和列表大小之间的随机数,然后拉出问题,并从该索引处的列表中删除该问题,以确保不会再次拉出。不是吗删除后,使用新的大小(大小-n)生成另一个随机数我所要做的就是从列表中选择任意一个随机问题,并确保该问题在被问到后不会重复。你所说的方式是按照我所想的顺序进行。现在我希望我的问题对你来说是清楚的。如果有50个问题。我想问所有50个问题中的任何一个。不管它可能是第一次出现的第40个问题。但是在被询问之后,它不应该重复。所有50个问题都应该随机提问。这正是这段代码所做的,您生成一个介于0和列表大小之间的随机数,然后拉出该问题,并从该索引处的列表中删除该问题,以确保它不存在再次填充。然后在移除该列表后,使用列表的新大小(大小-n)生成另一个随机数。