现在很多网上购物网站,定期从在这个网站购物的人中抽取出随机几名消费者,给予奖励,但是要求在这个网站花钱越多的的人,被抽中的几率就越大。我是这样设计的,我设计了CustomRandom()继承Random()类,加入一个属性CustomList customlist,加入方法get(index),add(Object)核心方法 
Custom getCustomer():随机抽取出1名用户
CustomList getCustomers(int num):随机抽取出num名用户
CustomList getCustomerRandom(int max):随机抽取不多于max的随机名用户
void setRate(name/id,rate):给某个人设置被抽中的概率然后再写一个类用来通过用户消费数额计算出这个人被抽中的概率是说少,然后把其返回值传到setRate里现在setRate不太好实现,设置了这个,保证getCustomer(),getCustomers(int num),setRate(name/id,rate),抽中的name那个人的概率都为rate值,问问大家有没有什么好方案?还有最后一件事情:如何测试自己的方法,我打算写一个特别大的循环让其在机器调用三个随机方法跑一段时间,比如50000次,看看抽取那个人的概率是不是我设的那个值,循环次数越多,应该越接近那个值才对。

解决方案 »

  1.   

    Math.abs(rdm.nextInt())%10+1
    概率吗 这样就是1/10了
      

  2.   

    依我所见我觉得应该在你觉得消费金额多的先进行一次随即;主要目的是让他们进行优先选择;
    然后在把总的进行随即,若随即出来与上面的重复则continue
    最后把2次随即出来的加起来即为总随即
      

  3.   


    看了楼主在10楼的发言,明白楼主要问的是啥了;有点难度;参照7楼的吧,可行的;按照楼主的原意,可以给一份思路:假设总人数是10000,所有人的中将几率加起来是万分之一万;假设一个人的中奖几率是万分之5(这个就是楼主你自己设定的值了)就分配给这个人5个数字 1,2,3,4,5然后用java自带的方法产生1~10000之间随机数,随机数是1~5的时候就表明这个人中奖了
      

  4.   

    设t=cou的消费额/总消售额;
    cou为客户帐号;
    public int ran(int cou){
       if(new Random().nextInt((int)(1/t))==1)
         return cou;
     }  
      

  5.   


    也许这样可以
    1.对每一个顾客的抽奖概率用两个字段表示如rate_sta,rate_end,都设为整数吧,为了准确,就把客户的消费额作为两个字段的差,那么这个顾客的抽奖概率为rate_end-rate_sta+1,该用户的消费金额为rate_end-rate_sta+1,
    每个用户的rate_sta都是前面最后一条记录的rate_end+1,那么第一条记录的rate_sta=0,rate_end为他的消费金额;
    比如现在有三个客户:A1,A2,A3。 他们的消费金额分别为100,200,300(人们币),则它们的rate_sta,rate_end分别为0,100;101,300;301,600
    2.利用随机函数产生一个随机数,根据最后一条记录的rate_end,求出一个中奖概率,那么中奖顾客的概率应该包含这个中奖概率,公式为 Money=  最后一条记录的rate_end*随机数/100
    还是对于上面的三个客户A1,A2,A3,假设产生的随机数为40,则 Money=600*40/100=240,客户A2的概率字段包含240,应该客户A2中奖
    从抽奖的概率来看应该符合要求!
      

  6.   

    考虑了一下,概率应该也可以用一个字段表示,只用rate_end就可以了,新增记录的时候,新记录的rate_end就用最后一条记录的rate_end+该顾客的消费金额表示
    对于步骤二中的求出的Money,中奖概率采用两个相邻记录的rate_end区间进行比较就可以了,左开右闭的区间,大于前一条记录的rete_end小于等于该记录的rate_end,第一条记录可以采用rate_end跟0这个区间
    纠正上面一个错误:原先第一条记录(客户A1)的rate_sta应该为1
      

  7.   

    完全同意楼上的说法。
    简单点说
    例如,消费 3,5,2,4,1 (消费顺序是乱的)的5个人。
    总共消费了 15 。 随机产生 1-15的数,假设为9
    然后打乱顺序,(也可以不打乱,因为消费顺序本身就是乱的)
    计算,a_1+ … +a_n >= 9
    因为
    n=3 ,3+5+2 >= 9
    所以,第3个人中奖。可以验证一下
    第一个人消费 3,它能中奖的话,随机产生的数字,只能是1、2、3
    第二个人消费 5,它能中奖的话,随机产生的数字,只能是4、5、6、7、8
    第三个人消费 2,它能中奖的话,随机产生的数字,只能是9、10
    第四个人消费 4,它能中奖的话,随机产生的数字,只能是11、12、13、14
    第五个人消费 1,它能中奖的话,随机产生的数字,只能是15
    可以看出,完成符合题意。如果还想抽个二等奖
    把中一等奖的那个顾客的消费去处
    用新的消费序列 3,5,4,1
    再产生一个中奖者就行了
      

  8.   

    计算,a_1+ … +a_n > = 9 时
    n 的最小值才是解。