Source code: org/objectstyle/ashwood/random/Roulette.java
1 /* ====================================================================
2 *
3 * Copyright(c) 2003, Andriy Shapochka
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials
17 * provided with the distribution.
18 *
19 * 3. Neither the name of the ASHWOOD nor the
20 * names of its contributors may be used to endorse or
21 * promote products derived from this software without
22 * specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *
35 * ====================================================================
36 *
37 * This software consists of voluntary contributions made by
38 * individuals on behalf of the ASHWOOD Project and was originally
39 * created by Andriy Shapochka.
40 *
41 */
42
43 package org.objectstyle.ashwood.random;
44
45 import java.util.*;
46
47 public class Roulette implements Iterator {
48 private Random random;
49 private int[] sectors;
50
51 public Roulette(int sectorCount) {
52 this(sectorCount, 1, new Random());
53 }
54 public Roulette(int sectorCount, int sectorSelectionCount, Random randomizer) {
55 random = randomizer;
56 this.sectors = new int[sectorCount];
57 Arrays.fill(sectors, sectorSelectionCount);
58 }
59 public Roulette(int[] sectors, Random randomizer) {
60 random = randomizer;
61 this.sectors = new int[sectors.length];
62 System.arraycopy(sectors, 0, this.sectors, 0, sectors.length);
63 }
64 public boolean hasNext() {
65 for (int i = 0; i < sectors.length; i++) {
66 if (sectors[i] > 0) return true;
67 }
68 return false;
69 }
70 public Object next() {
71 int pointedSector = random.nextInt(sectors.length);
72 for (int i = pointedSector; i < sectors.length; i++) {
73 if (sectors[i]-- > 0) return new Integer(i);
74 }
75 for (int i = 0; i < pointedSector; i++) {
76 if (sectors[i]-- > 0) return new Integer(i);
77 }
78 return null;
79 }
80 public void remove() {
81 throw new java.lang.UnsupportedOperationException("Method remove() not supported.");
82 }
83 }