public static void main(String[] args) { // 设置奖励 List<Integer> prices = new ArrayList<Integer>(); for (int i = 0; i < 100; i++) { prices.add(i); } Collections.shuffle(prices);// 将奖打乱 Map<User, Integer> users = new HashMap<User, Integer>(); // 设置人 for (int i = 0; i < 100; i++) { User user = new User();// user实体类只提供了name属性,为了方便起见,重写hashcode和equals方法,认为同一个名字对应同一个user,当然可以设置uuid加以区别,这里不做修改 user.setName("user" + i); int price = 0; int number = prices.get(i); if (number < 10) { price = 1; } else if (number < 30) { price = 2; } else { price = 3; } users.put(user, price); System.out.println(user.getName() + " get " + price + " price"); } // 提供查询指定人的奖励 User user = new User(); user.setName("user50"); System.out.println(users.get(user)); }这才是对的代码,前面的写错了,概率不对,你不能打印出user50是因为没有重写hashcode和equals方法
之前的代码之所以错是因为你会发现越是往后的用户得奖率越高,这是因为之前的用户中三等奖的几率特别高,而在三等奖抽完之后,后来的人抽剩余1,2等奖的几率自然就高了,因为3等奖没了嘛.简单来说,只有第一个人是按照标准的抽奖几率的,越往后,中奖几率越高.新的代码解决了这个问题,总共100个奖,已经是10,20,70的分好了奖,只需要将 它随机打乱,之后依次分发给每个人,这才是没有猫腻的抽奖,以下是user实体类public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }}
我们的要求是把100个参与者信息放到hashmap中(悲剧不太熟悉hashmap)。。我的疑问是具体方法写法是怎么样的0.0 我是个新手0.0 求指教
// 设置奖励
int firstPrice = 10;
int secondPrice = 20;
int thirdPrice = 70;
Map<User, Integer> users = new HashMap<User, Integer>();
// 设置人
for (int i = 0; i < 100; i++) {
User user = new User();//user实体类只提供了name属性,为了方便起见,重写hashcode和equals方法,认为同一个名字对应同一个user,当然可以设置uuid加以区别,这里不做修改
user.setName("user" + i);
int price = 0;
double random = Math.random();// 模拟抽奖
if (random < 0.1) {
if (firstPrice == 0) {// 判断是否一等奖抽完了,抽完取二等奖,下同
random = 0.1;
} else {
price = 1;
firstPrice--;
}
}
if (random >= 0.1 && random < 0.2) {
if (secondPrice == 0) {
random = 0.2;
} else {
price = 2;
secondPrice--;
}
}
if (random >= 0.2 && random < 1) {
if (thirdPrice == 0) {// 如果三等奖抽完,奖励往上拿
if (secondPrice == 0) {
price = 1;
firstPrice--;
} else {
price = 2;
secondPrice--;
}
} else {
price = 3;
thirdPrice--;
}
}
users.put(user, price);
System.out.println(user.getName() + " get " + price + " price");
}
//提供查询指定人的奖励
User user = new User();
user.setName("user50");
System.out.println(users.get(user));
}
是按抽奖的比率是10%,20%和70%来计算的哈。。 我不是很熟悉hashmap的用法和随机数的用法。。但是看了你写的代码 为什么你说写错了呢、、
// 设置奖励
List<Integer> prices = new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
prices.add(i);
}
Collections.shuffle(prices);// 将奖打乱
Map<User, Integer> users = new HashMap<User, Integer>();
// 设置人
for (int i = 0; i < 100; i++) {
User user = new User();// user实体类只提供了name属性,为了方便起见,重写hashcode和equals方法,认为同一个名字对应同一个user,当然可以设置uuid加以区别,这里不做修改
user.setName("user" + i);
int price = 0;
int number = prices.get(i);
if (number < 10) {
price = 1;
} else if (number < 30) {
price = 2;
} else {
price = 3;
}
users.put(user, price);
System.out.println(user.getName() + " get " + price + " price");
}
// 提供查询指定人的奖励
User user = new User();
user.setName("user50");
System.out.println(users.get(user));
}这才是对的代码,前面的写错了,概率不对,你不能打印出user50是因为没有重写hashcode和equals方法
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}}
你好 我还有点问题不是很清楚 就是能不能讲一下 或者注释一下User类里面这两个重写的方法是什么意思吗。。
谢谢! 那如果我要以id来给这些人随机分配 是不是只需将其中的“name”换成“id”就可以了?
谢谢! 那如果我要以id来给这些人随机分配 是不是只需将其中的“name”换成“id”就可以了?在equals和hashcode中都改一下就可以了
谢谢! 那如果我要以id来给这些人随机分配 是不是只需将其中的“name”换成“id”就可以了?在equals和hashcode中都改一下就可以了好的 谢谢了哈!