【问题标题】:print random characters without repeat in square?打印随机字符而不在正方形中重复?
【发布时间】:2018-03-16 03:46:19
【问题描述】:

我正在通过下面的代码生成随机字符:

static void printRandomWhatEver(int NUMBER_OF_CHARACTER,
                                int NUMBER_OF_LINES,
                                char char1, char char2) {
    int DIFFERENCE_SQUARE = 4;
    char oldChar, newChar, random;
    for (int i = 0; i < NUMBER_OF_CHARACTER; i++) {
        random = getRandomCharacter(char1, char2);
        if ((i + 1) % NUMBER_OF_LINES == 0) { // new line each new NUMBER_OF_LINE
            System.out.println(random);
        } else {
            System.out.print(random);
        }
    }

}

我的 getReandomCharacter:-

private static char getRandomCharacter(char ch1, char ch2) {
    return (char) (ch1 + Math.random() * (ch2 - ch1 + 1));
}

一切正常,我需要的是 chars 在正方形 2*2 内的数字不等于,这是解释我需要的图像。

数字4在同一个方格中:-

**
**

如何防止数字在正方形的一部分中相等?

提前致谢。

【问题讨论】:

  • “相似”是指“相等”吗? “相似”一词通常用于比相等更弱的关系。如果是较弱的关系,请解释它是什么。
  • @JohnColeman 确实是的,谢谢!

标签: java loops for-loop math random


【解决方案1】:

只需存储输出的最后一行,并将位置N 的数字与数字last_line[N-1]last_line[N]last_line[N+1] 进行比较。注意N-1N+1 的数组边界。

但您应该知道,这样会降低随机数生成器的强度。不过,对于人类来说,它很可能看起来“更随机”。

但人类可能会识别为“非随机”的更多模式,例如连续数字:

154
298
364

【讨论】:

  • 对,随机变得不随机了。
  • 是的。发布了我的答案后,我想了更多。您可以一次生成一行,从选择中删除 2 个(在末端)或 3 个(在中间)数字。我仍然更喜欢随机挑选,因为它消除了重新挑选不正确的数字。
【解决方案2】:

为避免重复,您最好改组而不是随机挑选。您将不得不反复选择不同的数字组进行随机播放以避免重复。

首先,从 [0..9] 中选择四位数字并随机播放:

0 1
2 3

从左到右,接下来的两位数字来自 [0, 2, 4..9],省略了 1 和 3:

0 1 7
2 3 8

重复该过程,一次从八个可能的数字中添加两个。

使用类似的“七选二”流程在下一行添加数字。您只有七位数字可供选择,因为在给定配置中选择“8”很危险:

0 1 7
2 3 8
1 8

将是一个错误,因此无法选择“8”:

0 1 7
2 3 8
1 5

是安全的。

一旦你离开左手边,你将从六位中挑选,因为上面一行中会有四位数字是你必须避免的。

ETA:处理两行过于复杂。一次生成一行,从预洗牌选择中删除任何现有的相邻数字。这将是上面行中的 3 位数字,加上当前行中的前一个数字,并针对左右边界进行适当调整。

【讨论】:

  • 我相信有更好的方法..?
猜你喜欢
  • 2019-11-05
  • 2020-01-16
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2015-02-20
  • 2015-07-02
相关资源
最近更新 更多