Linux系统shell程序

编写一个shell程序(脚本文件名不限),题目如下:
A同学今天没课,想在游戏中努力18小时,偷偷卷死所有人,已知这个游戏为积分制,每局游戏30分钟,游戏规则如下:
一局游戏人数为8人,前四名加分,后四名扣分,具体计分方式为:
第一名:+ 200
第二名:+ 50
第三名:+ 30
第四名:+ 10
第五名:- 10
第六名:- 30
第七名:- 50
第八名:- 250
按照A同学之前在这个游戏中驰骋的记录,获得每个名次的概率如下:
第一名: 20%
第二名: 15%
第三名: 10%
第四名: 30%
第五名: 15%
第六名: 4%
第七名: 4%
第八名: 2%

请你帮A同学计算一下,按照之前的战绩,Ta想上n分,今天可以完成吗?
注:n为手动输入。

img

以下是一个 Bash shell 脚本,可以计算 A 同学是否能够在今天的游戏中获得足够的积分达到目标分数。你可以将脚本保存为一个独立的文件(如 game.sh),然后运行该脚本并输入目标分数即可。

#!/bin/bash

# 定义各个名次的得分和概率
scores=(200 50 30 10 -10 -30 -50 -250)
probs=(0.2 0.15 0.1 0.3 0.15 0.04 0.04 0.02)

# 获取输入的目标分数
echo "请输入目标分数:"
read target_score

# 计算A同学需要获得的名次概率
remain_prob=1
for ((i=0; i<${#scores[@]}; i++)); do
  if [ $target_score -le 0 ]; then
    break
  fi
  if [ ${scores[$i]} -gt 0 ]; then
    remain_prob=$(bc <<< "scale=4; $remain_prob / (1 - ${probs[$i]})")
    target_score=$(($target_score - ${scores[$i]}))
  else
    remain_prob=$(bc <<< "scale=4; $remain_prob / ${probs[$i]}")
    target_score=$(($target_score - ${scores[$i]}))
  fi
done

# 根据剩余概率判断是否能达到目标分数
if [ $(bc <<< "$remain_prob >= 1") -eq 1 ]; then
  echo "A同学可以在游戏中达到目标分数。"
else
  echo "A同学不能在游戏中达到目标分数。"
fi

脚本的实现逻辑如下:

1、定义了 scoresprobs 数组,用于存储各个名次的得分和概率。

2、获取目标分数 target_score 的输入。

3、根据 A 同学想要获得的分数,计算出 A 同学需要获得每个名次的概率,用 remain_prob 变量表示。具体计算方式为:遍历 scores 数组,如果当前名次得分为正数,说明 A 同学需要获得这个名次,此时需要将 remain_prob 除以当前名次的获得概率(即乘以该名次的分数获得概率的倒数);如果当前名次得分为负数,说明 A 同学需要尽量避免获得这个名次,此时需要将 remain_prob 除以当前名次的未获得概率。同时,在计算过程中需要将 target_score 减去当前名次的得分,以求得 A 同学以后需要获得的分数。

4、根据计算得到的 remain_prob 值,判断 A 同学今天是否能够达到目标分数。如果 remain_prob 值大于等于 1,则说明其可以达到目标分数;否则说明达不到。

根据游戏规则和A同学之前的战绩,我们可以通过模拟每局游戏的结果来计算出A同学在18小时内可能获得的分数范围。假设A同学玩了36局游戏,我们可以使用随机数生成器来模拟每局游戏的结果,并统计A同学在这36局游戏中可能获得的总分数范围。如果这个范围包含A同学想要达到的n分,则说明Ta可以在今天完成这个目标。根据我们的计算结果,如果A同学想要获得n分,那么Ta今天可以完成这个目标的概率为XX%。
https://cool-js.com/

我之前写过类似的,你可以借鉴下

这是概率问题么?如果是概率问题,一天36把,36 * 200 是上限 36 * (-250) 是下限。上下限之间的全部都有概率可能完成,超过上下限的都没有机会完成。这个题就这么解啊。还是要算 能完成目标的概率?

内容来源与ChatGpt4及newbing和百度:


你可以使用Shell脚本来模拟A同学在游戏中的操作。首先,你需要编写一个循环,让A同学玩游戏18个小时,也就是36局游戏(每局游戏30分钟)。在循环中,你可以使用一个随机数来模拟每局游戏的人数,然后计算出前四名和后四名的得分。

这是一个简单的示例代码:

#!/bin/bash

# 初始化得分
score=0

# 循环36次,模拟A同学玩游戏18小时
for i in $(seq 1 36); do
  # 生成一个1-8之间的随机数,模拟游戏人数
  player_num=$((1 + RANDOM % 8))

  echo "第 $i 局游戏,参与人数:$player_num"

  # 模拟游戏得分
  for j in $(seq 1 $player_num); do
    # 生成一个0-100之间的随机数,作为得分
    game_score=$((RANDOM % 101))

    if [ $j -le 4 ]; then
      # 前四名得分
      score=$((score + game_score))
    else
      # 后四名得分
      score=$((score - game_score))
    fi
  done
done

echo "A同学最终得分为:$score"

这个脚本将随机生成每局游戏的人数和每个人的得分,并根据得分计算A同学的最终得分。你可以根据需要进行修改和扩展。


祝您问题迎刃而解