【问题标题】:bash - while loop - rolling 2 dicebash - while 循环 - 掷 2 个骰子
【发布时间】:2015-11-04 01:38:17
【问题描述】:

我正在编写一个掷 2 个骰子(有 6 个面)的 bash 脚本。当 2 个骰子命中双六时,我希望脚本停止(中断)并计算获得双六所需的掷数。

#!/bin/bash
DOUBLESIX="6-6"

while (( 0 ==0 )) ; do
     dice=$RANDOM; ((dice = dice % 6 )); (( dice = dice +1 ))
     dice2=$RANDOM; ((dice2 = dice2 % 6 )); (( dice = dice + 1))

pair="$dice-dice$2"
echo $pair

if [[ "$pair" == "$DOUBLESIX" ]]; then
      break
fi

done

echo "It took $count rolls to get 6-6 "

这是我到目前为止所拥有的。问题是,我如何计算 while 循环运行了多少次并将其放入我的 $count 中?

提前致谢!

【问题讨论】:

  • 你确定那些循环检查没问题?
  • 如果您将第一个称为“dice1=”而不是“dice=”,那么当您使用“dice2”时,您将不会有冲突的名称:)
  • 如果您在变量名${foo} 周围使用大括号,就像paxdiablo 在他的回答中所做的那样,您就不会像racraman 警告的那样遇到名称冲突。

标签: bash shell unix


【解决方案1】:

我不会对您的代码存在的其他潜在问题发表过多评论,例如dice$2“变量”,或者您可以生成一个介于 1 和 6 之间的随机数,而使用更简单的 @ 987654322@ - 修复/改进这些的学习过程将使您成为更好的编码器。


但是,对于如何保持计数的具体问题,这相对简单。在循环开始之前,插入以下代码将计数初始化为零:

((count = 0))

然后,每次掷出两个骰子,使用以下内容来增加计数:

((count = count + 1))

如何做到这一点的示例如下所示。它用于从一数到十,但你应该明白:

((count = 1))
while [[ ${count} -le 10 ]] ; do
    echo $count
    ((count = count + 1))
done

对于它的价值(如果这是一个课堂作业问题,请不要使用它,如果认为教育工作者不会在网上搜索抄袭,你会发疯的),这就是我将如何实现这样一个野兽:

#!/bin/bash

DESIRED="6-6"
((count = 0))
dice="NOT ${DESIRED}"
while [[ "${dice}" != "${DESIRED}" ]] ; do
    ((count = count + 1))
    ((die1 = $RANDOM % 6 + 1))
    ((die2 = $RANDOM % 6 + 1))
    dice="${die1}-${die2}"
    echo ${dice}
done

echo "It took ${count} rolls to get ${DESIRED}"

【讨论】:

  • bash 也有 ((count++)) 如果简洁值得。
  • 谢谢!我刚刚在我当前的一个中添加了计数位,它可以工作。你的肯定是野兽=]
  • 我倾向于使用冒号或空格之类的东西或除减法运算符以外的东西来分隔值。与其说是为了功能,不如说是为了以后的代码读者。 :)
  • @danny,我使用了-,因为这是 OP 使用的。可能是不同的角色可能会更好,我拒绝对此发表评论:-)
  • 呸。 “阅读原始问题。” :D
【解决方案2】:

我建议为此使用shuf

#!/bin/bash
declare -i count=1
while [ "6 6" != "$(shuf --input-range='1-6' -r -n 2 | xargs)" ]; do
    (( ++count ))
done
echo "It took $count rolls to get double six."

为了生成 1 到 6 之间的两个随机数,我们使用

    shuf --input-range='1-6' -r -n 2

shuf [OPTION]... [FILE] 将输入行的随机排列写入标准输出。每个输出排列的可能性相同。 -i lo-hi--input-range=lo-hi 就像输入来自包含无符号十进制整数范围 lo-hi 的文件一样,每行一个。 -r--repeat 重复输出值,即用替换选择。使用此选项,输出不是输入的排列;相反,每条输出线都是从所有输入中随机选择的。 -n count--head-count=count 最多输出count 行(默认情况下,所有输入行都输出)。如果没有给出--head-count,则 shuf 会无限重复。

输入man shuf 或查看coreutils manual 了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 2014-02-28
    • 2020-07-24
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2012-11-27
    • 2018-02-27
    相关资源
    最近更新 更多