【问题标题】:Random characters and random colors generator随机字符和随机颜色生成器
【发布时间】:2016-02-20 13:37:46
【问题描述】:
public static char randomLetter() {
    Random r = new Random();
    char randomChar = (char) (97 + r.nextInt(26));
    return randomChar;
}

public static Color randomColor(){
    Random rand = new Random();
    float r = rand.nextFloat();
    float g = rand.nextFloat(); 
    float b = rand.nextFloat();
    Color randomColor = new Color(r, g, b);
    return randomColor;
}

我有这两种方法。一个返回字母表中的随机字母,另一个返回随机颜色。 如何编辑这些方法,使randomLetter() 只返回一个字母而不返回两个相同的字母?

如何让我的randomColor() 只返回REDYELLOWGREENBLUE 之间的随机颜色?

【问题讨论】:

  • random是有原因的
  • 你说的“介于”是什么意思? REDYELLOWGREENBLUE 是唯一的选项,并且您每次都想选择 1 个吗?
  • 如果您只想“生成”每个元素一次,请将它们全部放在Queue 随机队列中,然后在需要时轮询元素。

标签: java random colors


【解决方案1】:

随机选择可以包含重复项。如果你不想重复,你想要的是随机播放。

这是一种方法。

package com.ggl.testing;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ShuffleTest {

    private static boolean shuffleLetters = true;
    private static boolean shuffleColors = true;

    private static int shuffleLetterIndex = 0;
    private static int shuffleColorIndex = 0;

    private static List<Character> letters = new ArrayList<>();
    private static List<Color> colors = new ArrayList<>();

    public static void main(String[] args) {
        System.out.println(shuffleLetter());
        System.out.println(shuffleLetter());
        System.out.println(shuffleLetter());

        System.out.println(shuffleColor());
        System.out.println(shuffleColor());
        System.out.println(shuffleColor());
    }

    public static char shuffleLetter() {
        if (shuffleLetters) {
            int start = (int) 'a';
            int end = (int) 'z';
            for (int i = start; i <= end; i++) {
                letters.add(Character.valueOf((char) i));
            }
            Collections.shuffle(letters);
            shuffleLetters = false;
        }

        return letters.get(shuffleLetterIndex++);
    }

    public static Color shuffleColor() {
        if (shuffleColors) {
            colors.add(Color.RED);
            colors.add(Color.YELLOW);
            colors.add(Color.GREEN);
            colors.add(Color.BLUE);
            Collections.shuffle(colors);
            shuffleColors = false;
        }

        return colors.get(shuffleColorIndex++);
    }

}

【讨论】:

  • 在代码上,设置shuffleLetters = false时你在做什么?我对随机播放一无所知,所以当你输入 Collections.shuffle(letters); 时你在做什么?
  • @Kisuna97:shuffleLetters 是第一次切换。第一次调用该方法时,它会在返回第一个字母之前创建并打乱字母。在随后的调用中,该方法返回列表中的下一个字母。洗牌就像洗牌一样。你还有 52 张卡片,只是顺序不同。
  • 我也不明白为什么你在 if 语句中使用 shuffleColors,然后在接近 if 语句的末尾时将其设置为 false
  • @Kisuna97:因为,正如我之前所说,我只需 一次 将列表洗牌。不是两次,不是三次。一次。
【解决方案2】:

改用enum

public enum ColorCode {     
  RED('r'), 
  YELLOW('y'),
  GREEN('g'),
  BLUE('b');

  public final char code;      

  public char getColorCode() {
    return this.code;
  }

  ColorCode(char code) {
    this.code = code;
  }
}

【讨论】: