我正在做一个程序,随机生成1-5中的3个数字。我想要它,以便在生成数字时,无法再次生成它。
就像这样,我不能得到121,只有134这样的东西
答案 0 :(得分:5)
您可以将所有可能的数字放入集合中。 然后你随机“逐出”它们。
此方法类似于Knuth's shuffle,效率高于{{3}} 一种天真的检查方法 - 是否已经生成或未生成, 因为后者可能不会终止。
答案 1 :(得分:1)
1.将3个数字转换为单个3位数字。
2.收集某些集合中所有已创建的数字(设置应该没问题)
3.如果新号码已经在集合中 - 再次生成它,直到它是全新的
public static void main(String[] args) {
final int digits = 5;
final int toGenarate = 10;
Set<Integer> used = new HashSet<Integer>();
int generated = 0;
while (generated < toGenarate) {
int number = generate(digits);
while (used.contains(number)) {
number = generate(digits);
}
used.add(number);
generated++;
System.out.println(number);
}
}
private static int generate(final int digits) {
final Random r = new Random();
return r.nextInt(digits) * 100 + r.nextInt(digits) * 10 + r.nextInt(digits);
}
答案 2 :(得分:1)
由于可能的结果集非常小,因此将它们全部枚举,将它们放在数据结构中,然后随机选择并删除它们是完全合理的。枚举也很简单:您正在查找可能值集的笛卡尔积,并且有许多众所周知的方法可以实现这一点,只需在搜索框中键入它即可。
答案 3 :(得分:0)
如果您只想要3个随机数,请使用伪代码:
如果您有超过3个数字可以使用外部循环和地图
我现在看到它在java中
import java.util.*;
public class RandomSet{
public static void main(String[]a){
java.util.Random rnd = new java.util.Random ();
final int high = 5, low = 1, ll = low - 1;
int r1 = ll,r2 = ll,r3 = ll;
r1 = rnd.nextInt(high - 1) + low;
while(r2 == (ll) || r2 == r1){
r2 = rnd.nextInt(high - 1) + low;
}
while(r3 == (ll) || r3 == r1 || r2 == r3){
r3 = rnd.nextInt(high - 1) + low;
}
System.out.println("r1 " + r1 + "; r2 " + r2 + "; r3 " + r3);
RandomSet app = new RandomSet();
Set t = app.randomSet(5, 1, 3);
Iterator i = t.iterator();
System.out.println(" randomSet ");
while(i.hasNext()){
System.out.println(" " + i.next());
}
}
public Set<Integer> randomSet(final int high, final int low, final int number){
if(number > (high - low)){
throw new RuntimeException("bad high low for number");
}
Map<Integer,Integer> rnds = new HashMap<Integer,Integer>();
java.util.Random rnd = new java.util.Random ();
int r1 = 0;
while(rnds.size() < number){
r1 = rnd.nextInt(high - 1) + low;
rnds.put(r1, r1);
}
return rnds.keySet();
}
}
答案 4 :(得分:0)
这似乎是学生的问题,因此不会包含太多代码。
假设您有一副纸牌,并且您想要将扑克牌交给玩家。你会怎么做?你拿一副牌,洗牌,交五张牌。但是你的问题不是卡片,而是一个数字列表:
List<Integer>
。Collections
课程。List.remove(int)
返回的内容。
另一种不涉及改组的方法是:
List<Integer>
。使用笔和纸验证列表中的任何整数是以3/5的概率选择的。