如果是随机获奖是用random,和存储 hashmap无关啊,存储用hashset,list,数组都可以实现的,不太清楚楼主的疑问在哪里,
随机生成百分比的奖励就是了

解决方案 »

  1.   


    我们的要求是把100个参与者信息放到hashmap中(悲剧不太熟悉hashmap)。。我的疑问是具体方法写法是怎么样的0.0   我是个新手0.0 求指教
      

  2.   

    public static void main(String[] args) {
    // 设置奖励
    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));
    }
      

  3.   


    是按抽奖的比率是10%,20%和70%来计算的哈。。 我不是很熟悉hashmap的用法和随机数的用法。。但是看了你写的代码 为什么你说写错了呢、、
      

  4.   

    只是最后貌似不能打印出user50这个用户得的几等奖0.0
      

  5.   

    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方法
      

  6.   

    之前的代码之所以错是因为你会发现越是往后的用户得奖率越高,这是因为之前的用户中三等奖的几率特别高,而在三等奖抽完之后,后来的人抽剩余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;
    }}
      

  7.   

    hashmap就是map啊,kv对保存数据,不难啊,代码逻辑也不复杂,应该好写,重要是能实现功能,hashmap怎么用都可以,如果不需要用 hashmap非得用就不知道为啥要这么出题了
      

  8.   


    你好 我还有点问题不是很清楚  就是能不能讲一下 或者注释一下User类里面这两个重写的方法是什么意思吗。。
      

  9.   

    这两个方法是eclipse自动生成的,具体的作用就是可以通过选中的值来进行equals的比较,比如user实体类中有name,age,sex等属性,但是我认为name一致这两个就是同一个人了,那我只要判断name是否一致就可以了,至于上面的内容是指自反性,对称性,以及传递性具体原因你可以网上查一下,hashcode的原因是因为hashmap中会先根据hash值来查找数据,查找到之后再进行equals比对如果不重写,在hashmap中也是找不到这个对象的,所以要找到这个对象必须重写这两个方法
      

  10.   


    谢谢!  那如果我要以id来给这些人随机分配 是不是只需将其中的“name”换成“id”就可以了?
      

  11.   


    谢谢!  那如果我要以id来给这些人随机分配 是不是只需将其中的“name”换成“id”就可以了?在equals和hashcode中都改一下就可以了
      

  12.   


    谢谢!  那如果我要以id来给这些人随机分配 是不是只需将其中的“name”换成“id”就可以了?在equals和hashcode中都改一下就可以了好的 谢谢了哈!