我创建了以下方法,以便创建唯一的随机数。 (此唯一值属于树的节点):
static Random rand = new Random();
public static ArrayList<Node> go(int n) {
ArrayList<Node> list = new ArrayList<Node>();
ArrayList<Integer> numList = new ArrayList<Integer>();
// TODO Auto-generated method stub
for(int i = 1; i<=5; i++)
{
int number = rand.nextInt(10)+1;
if(list.size()>0 && !check(list,number))
{
i--;
continue;
}
numList.add(number);
Node node = new Node();
node.data = number;
list.add(node);
}
int w = 0;
for (Node d : list) {
System.out.println(w+": "+d.data);
w++;
}
return list;
}
private static boolean check(ArrayList<Node> list, int num) {
// TODO Auto-generated method stub
boolean b = false;
/*if(list.size()==0)
return true;
*/
for (Node node : list) {
if(node.data == num)
b = false;
else
b = true;
}
return b;
}
但它不会创建唯一的数字,我的列表中仍然存在重复数字。喜欢:
0: 10
1: 1
2: 10
3: 5
4: 6
答案 0 :(得分:6)
问题是如果找到重复的数字,你不会在check函数内停止for循环。循环继续,b可以变回true。
你应该做的是例如:
private static boolean check(ArrayList<Node> list, int num) {
for (Node node : list) {
if(node.data == num)
return false;
}
return true;
}
答案 1 :(得分:3)
JónTraustiArason有你的答案,但是......
由于您拥有有限数量的允许值(整数),并且由于您不希望同一个值被多次拾取,因此可能更容易只需shuffle一组允许值。然后你可以从数组中选择下一个值,而不用担心每次检查是否重复。
在您的示例中选择介于1和10之间的五个值,您可以从数组{1,2,3,4,5,6,7,8,9,10}
开始,然后通过随机播放将其重新排列为{3,4,7,1,10,9,5,8,2,6}
之类的其他内容。从结果数组中取出前五个值,不用担心重复。
答案 2 :(得分:1)
在你的检查方法中,这看起来有点狡猾:
if (node.data == num)
b = false;
else
b = true
当你找到一场比赛(例如b =假)时,你想回来吗?否则,下一次循环b可能会设置为true。为简化一点,如果要检查项目是否在集合中,可以执行list.contains(element)
答案 3 :(得分:1)
您“忘记”使用您准备好的numList
。
此代码应该可以正常工作:
static Random rand = new Random();
public static ArrayList<Node> go(int n) {
ArrayList<Node> list = new ArrayList<Node>();
ArrayList<Integer> numList = new ArrayList<Integer>();
for (int i = 1; i <= 5; i++) {
int number = rand.nextInt(10) + 1;
if (numList.contains(number)) {
i--;
continue;
}
numList.add(number);
Node node = new Node();
node.data = number;
list.add(node);
}
int w = 0;
for (Node d : list) {
System.out.println(w + ": " + d.data);
w++;
}
return list;
}
答案 4 :(得分:1)
以@ eaj的观点来说明。
public static List<Node> go(int n) {
List<Integer> numbers = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) numbers.add(i);
Collections.shuffle(numbers);
List<Node> nodes = new ArrayList<Node>();
for (Integer data : numbers.subList(0, 5))
nodes.add(new Node(data)); // use a constructor for Node.
for (int w = 0; w < nodes.size(); w++)
System.out.println(w + ": " + nodes.get(w).data);
return nodes;
}
答案 5 :(得分:0)
您的check
功能错误。目前,它只返回 last 元素是否与num
匹配。您希望在找到匹配项后声明true
(例如,使用return true;
)。
事实上,你可以在没有b
的情况下做任何事情。我确信您可以使用list
的{{1}}方法代替。
答案 6 :(得分:0)
您应该将check
方法更改为:
private static boolean check(ArrayList<Node> list, int num)
{
for (Node node : list)
if (node.data == num)
return false;
return true;
}
通过这种方式,您可以查看列表并在找到相同元素后立即返回false
。如果您能够在不返回的情况下完成循环,则不会找到重复项,您可以返回true
。
答案 7 :(得分:0)
这是我的解决方案:
import java.util.ArrayList;
import java.util.Collections;
public class comboGenerator {
public static void main(String[] args) {
ArrayList<Integer> $combo = new ArrayList<Integer>(); // init. array list combo for randomization
while ($combo.size() < 6) {
int rand = (int) (Math.random()*49+1); // make new random number 1-49
if (!$combo.contains(rand)){ // check if we have that number in array list,{
$combo.add(rand); // if there is no such number then add it to array list
Collections.sort($combo); // sort the array list small >> large
}
}
System.out.println("Random combination " + $combo);
}
}
你不能得到相同的数字!