最近在關注某個羣舉辦的龍文徵集活動,突然想到是不是還可以舉辦一個“硬核”點的活動,於是這個計劃誕生了。
打算春節正式開始,提前10天開放報名。競賽共3題,參與者有24小時答題時間。只看最終答案是否正確,按得分發放遊戲類獎品。歡迎各位鱗友前來挑戰!
說是數學競賽,但以趣味性爲主,不需要多少專業知識。高數不掛科,配合少量編程知識應該能輕鬆滿分。
會在本帖緩慢更新樣卷(共3題)
有 2 位朋友喜欢这篇文章:龍爪翻書, Raventhorn
“Let there be light!”
And there was light.
离线
針對第一個問題,我讓chatGPT用python計算了一下結果 ,結果如下:
首次發生該事件最有可能出現在第 1009次,此時的概率約爲 6.28%。
离线
我也用chatGPT計算了~
但算出來的是1015歲
(chatGPT思考了2分鐘5秒,印象中我還是第一次遇到思考這麼久的~)
最后修改: 龍爪翻書 (2025-01-05 00:05:01)
有 1 位朋友喜欢这篇文章:Anbach
←目前頭像感謝安雅贈圖。
Quit, dont quit... Noodles, dont noodles...
There is a saying: yesterday is history, tomorrow is a mystery, but today is a gift. That is why it is called the present.
离线
我檢查了一下,下面的代碼應該沒有錯。並且驗證了最終求和結果也爲1。
# 定义发生概率的函数
def occurrence_probability(k):
if k < 1000:
return 0 # 前999次发生概率为0
prob = 1.0
for i in range(1000, k): # 计算前 k-1 次未发生的概率
prob *= (1 - (i - 999) / 100)
if prob < 1e-10: # 避免过小的概率
break
prob *= (k - 999) / 100 # 第 k 次发生的概率
return prob
# 计算从第1000次到第1099次首次发生的概率
k_range = range(1000, 1100)
probabilities_range = [occurrence_probability(k) for k in k_range]
# 输出概率列表
for k, prob in zip(k_range, probabilities_range):
print(f"第 {k} 次的概率: {prob:.10f}")
# 求和验证
total_prob = sum(probabilities_range)
print(f"从第1000次到第1099次的概率总和: {total_prob:.10f}")
輸出的結果爲:
第 1000 次的概率: 0.0100000000
第 1001 次的概率: 0.0198000000
第 1002 次的概率: 0.0291060000
第 1003 次的概率: 0.0376437600
第 1004 次的概率: 0.0451725120
第 1005 次的概率: 0.0514966637
第 1006 次的概率: 0.0564746745
第 1007 次的概率: 0.0600245112
第 1008 次的概率: 0.0621253691
第 1009 次的概率: 0.0628156510
第 1010 次的概率: 0.0621874944
第 1011 次的概率: 0.0603784037
第 1012 次的概率: 0.0575607449
第 1013 次的概率: 0.0539299902
第 1014 次的概率: 0.0496926338
第 1015 次的概率: 0.0450546547
第 1016 次的概率: 0.0402112793
从第1000次到第1099次的概率总和: 1.0000000014
离线
1000歲應該是0.001吧?
在1000歲時的死亡概率爲1‰
另外題目中
之後每年的死亡概率爲前一年死亡概率+n‰,n爲龍的當前年齡減1000。
那麼1000歲死亡概率0.001
1001歲爲0.001+(1001-1000)‰=0.002
1002歲0.002+(1002-1000)‰=0.004
1003歲0.004+(1003-1000)‰=0.007
可以看出即使是單純的死亡概率也不是線性增加,而代碼裏是:
prob *= (1 - (i - 999) / 100)
按照我的初步計算,到1045歲(要麼是1046,之前算的記不清了)死亡概率就會超過1。
又算了一下
所以找這個表達式的最大值對應的n就可以了,其中n>1。
原本打算用求導算零點的辦法,但發現這玩意求導找零點太複雜了,所以還是用這個式子加程序解決吧。
上面累乘求積的n-2應該改爲n-1
程序直接丟給ai
def calculate_expression(n):
product = 1
for i in range(1,n): # i從0到n-1
numerator = 1998 - i**2 + i
denominator = 2000
product *= numerator / denominator
# 當product過小時,忽略以避免精度丟失
if product < 1e-10:
product = 0
break
return (n**2 - n + 2) / 2000 * product
max_value = 0
best_n = 0
total_probability = 0
# 遍歷n值,解之前的P_n可以解出n的範圍在40多以下,
for n in range(2, 50):
current_value = calculate_expression(n)
total_probability += current_value
if current_value > max_value:
max_value = current_value
best_n = n
# 驗證所有概率相加是否爲1
if abs(total_probability + 0.001 - 1) < 1e-6:#加上999歲死亡概率
print(f"所有概率相加驗證通過,總和爲1。")
else:
print(f"所有概率相加驗證失敗,總和爲 {total_probability}。")
print(f"最大值出現在 n = {best_n},值爲 {max_value}")
最后修改: 羽落 (2025-01-06 10:32:12)
若有謬誤,務必告知。
离线
我犯了一個錯,把題目裏的“‰”看成“%”了。
更正這個錯誤後,最終結果是:
第1031年概率最高,概率爲0.0193839289。
我的思路應該沒有錯誤,由於死亡的事件發生只分布在第1000年至第1999年。
每一年對應的概率計算如下:
第1000次的概率是0.001
第1001次是0.999×0.002
第1002次是0.999×0.998×0.003
第1003次是0.999×0.998×0.997×0.004
......
我學這些已經是很久前了,我不記得這叫什麼分佈了。
總之概率將從第1000年開始逐漸增大,到達峯值後開始逐漸減小。
由於事件必定發生在區間第1000年至第1999年(第1999死亡概率爲1),對此區間上的每一年的概率求和,結果將爲1,可以以此驗證步驟正確性。我已驗證過結果正確性。
具體代碼如下:
# 定义发生概率的函数
def occurrence_probability(k):
if k < 1000:
return 0 # 前999次发生概率为0
prob = 1.0
for i in range(1000, k): # 计算前 k-1 次未发生的概率
prob *= (1 - (i - 999) / 1000)
if prob < 1e-10: # 避免过小的概率
break
prob *= (k - 999) / 1000 # 第 k 次发生的概率
return prob
# 计算从第1000次到第1999次首次发生的概率
k_range = range(1000, 2000)
probabilities_range = [occurrence_probability(k) for k in k_range]
# 输出概率列表
for k, prob in zip(k_range, probabilities_range):
print(f"第 {k} 次的概率: {prob:.10f}")
# 求和验证
total_prob = sum(probabilities_range)
print(f"从第1000次到第1999次的概率总和: {total_prob:.10f}")
离线
之後每年的死亡概率爲前一年死亡概率+n‰,n爲龍的當前年齡減1000。
那麼1000歲死亡概率0.001
1001歲爲0.001+(1001-1000)‰=0.002
1002歲0.002+(1002-1000)‰=0.004
1003歲0.004+(1003-1000)‰=0.007
可以看出即使是單純的死亡概率也不是線性增加。
若有謬誤,務必告知。
离线
把坑全部踩了一遍,最後我的結果也是1015,概率爲0.066704
离线
需要達到:虯龍,發帖數100
https://yinglong.org/forum/viewtopic.php?id=234
------------
分享chatGPT的網址
https://chatgpt.com/share/677b05f4-3864-8004-a5bf-b273da0bfe0f
←目前頭像感謝安雅贈圖。
Quit, dont quit... Noodles, dont noodles...
There is a saying: yesterday is history, tomorrow is a mystery, but today is a gift. That is why it is called the present.
离线
离线
2.
感覺就是計算量略大,還是直接丟個ai跑代碼輕鬆。肯定不是因爲我並沒有學過python:
def calculate_dps(attr_points_attack, attr_points_interval):
# 初始攻擊力
attack_power = 100
# 初始攻擊間隔(毫秒)
attack_interval = 1000
# 總屬性點
total_attr_points = 100
# 消耗屬性點增加攻擊力
attack_power += attr_points_attack * 1.5
# 消耗屬性點縮短攻擊間隔
attack_interval *= (0.99 ** attr_points_interval)
# 每秒攻擊次數
attacks_per_second = 1000 / attack_interval
# 每秒傷害
dps = attack_power * attacks_per_second
return dps
def main():
max_dps = 0
best_attr_points_attack = 0
best_attr_points_interval = 0
# 窮舉所有可能的屬性點分配方式
for i in range(101):
for j in range(101 - i):
k = 100 - i - j
dps = calculate_dps(i, j)
if dps > max_dps:
max_dps = dps
best_attr_points_attack = i
best_attr_points_interval = j
print(f"最大每秒傷害爲: {max_dps}")
print(f"最佳的屬性點分配方案是將 {best_attr_points_attack} 點分配給攻擊力,{best_attr_points_interval} 點分配給攻擊間隔。")
if __name__ == "__main__":
main()
最后修改: 羽落 (2025-01-06 13:12:08)
若有謬誤,務必告知。
离线
第二個像是我學編程時,書上的作業題。
還是扔給chatGPT寫代碼。
# 动态调整方案代码(将单位从ms转换为s)
# 初始参数
attack = 100 # 初始攻击力
interval = 1.0 # 初始攻击间隔(s)
points = 100 # 升级点数
attack_increase = 1.5 # 每次提升攻击力
interval_multiplier = 0.99 # 每次攻击间隔缩短的比例
# 记录最终分配
attack_upgrades = 0
interval_upgrades = 0
# 动态分配点数
for _ in range(points):
# 计算两种升级后的DPS
dps_increase_attack = (attack + attack_increase) / interval
dps_increase_interval = attack / (interval * interval_multiplier)
# 比较收益,选择收益更高的升级
if dps_increase_attack > dps_increase_interval:
attack += attack_increase
attack_upgrades += 1
else:
interval *= interval_multiplier
interval_upgrades += 1
# 最终DPS
final_dps = attack / interval
# 输出结果
print(f"动态调整:攻击力升级 {attack_upgrades} 次,攻击间隔升级 {interval_upgrades} 次")
print(f"最大DPS为 {final_dps:.2f}")
結果是:
动态调整:攻击力升级 33 次,攻击间隔升级 67 次
最大DPS为 293.15
离线
直接用chatGPT,可能計算的精度不夠
理論實數解一樣是 32.8
但是到整數時,卻認為攻擊力增加35是最高
←目前頭像感謝安雅贈圖。
Quit, dont quit... Noodles, dont noodles...
There is a saying: yesterday is history, tomorrow is a mystery, but today is a gift. That is why it is called the present.
离线
沒想到第2題這麼快就被攻克了
下面是壓軸的第3題:
在一個DnD主題的養成類遊戲中,玩家可以嘗試用3只幼龍合成1只青年龍,用3只青年龍合成1只成年龍,用3只成年龍合成1只古龍,用3只古龍合成1只太古龍。每次合成有50%的概率成功,若成功則玩家失去3只低等級龍而獲得1只更高等級的龍,若失敗則玩家無法獲得更高等級的龍但返還1只參與合成的龍。如果要使獲得太古龍的概率大於等於75%,玩家需要擁有多少隻幼龍?
“Let there be light!”
And there was light.
离线
利用了一點小技巧解決問題3
通過求解單位“幼龍”對最終“太古龍”合成期望的貢獻,最後能輕易求出答案。
仍然是chatGPT編寫的代碼,使用了更精確的數據類型以避免較大誤差:
from decimal import Decimal, getcontext
# 设置高精度
getcontext().prec = 50
def calculate_min_level1_items(target_expectation=Decimal('0.75')):
# 定义每级物品所需等级1物品数量(用高精度Decimal表示)
level2_cost = Decimal('4.5') # 合成1个等级2需要的等级1数量
level3_cost = level2_cost * Decimal('3') # 合成1个等级3
level4_cost = level3_cost * Decimal('3') # 合成1个等级4
level5_cost = level4_cost * Decimal('3') # 合成1个等级5
# 计算各等级单位等级1物品的贡献
unit_contribution_level2 = Decimal('1') / level2_cost
unit_contribution_level3 = Decimal('1') / level3_cost
unit_contribution_level4 = Decimal('1') / level4_cost
unit_contribution_level5 = Decimal('1') / level5_cost
# 计算单位等级1物品对等级5的期望贡献
total_unit_contribution = unit_contribution_level5
# 计算所需等级1物品数量
min_level1_items = target_expectation / total_unit_contribution
# 返回向上取整的结果(因为物品数量必须为整数)
return min_level1_items.to_integral_exact(rounding='ROUND_CEILING')
# 调用函数
result = calculate_min_level1_items()
print(f"获得0.75个等级五物品至少需要的等级一物品数量: {result}")
輸出的結果爲:
获得0.75个等级五物品至少需要的等级一物品数量: 92
即需要92只幼龍。
离线
我這次的chatGPT說:
「期望消耗」是625隻
要達到至少 75% 以上的成功率,需要 700 多隻,它選擇729 這個漂亮的整數
←目前頭像感謝安雅贈圖。
Quit, dont quit... Noodles, dont noodles...
There is a saying: yesterday is history, tomorrow is a mystery, but today is a gift. That is why it is called the present.
离线
代碼還是錯的,chatGPT默認只考慮了第一步合成需要計算期望值,不檢查都沒注意到。
應該是這樣:
from decimal import Decimal, getcontext
# 设置高精度
getcontext().prec = 50
def calculate_min_level1_items(target_expectation=Decimal('0.75')):
# 定义每级物品所需等级1物品数量(用高精度Decimal表示)
level2_cost = Decimal('5') # 合成1个等级2需要的等级1数量
level3_cost = level2_cost * Decimal('5') # 合成1个等级3
level4_cost = level3_cost * Decimal('5') # 合成1个等级4
level5_cost = level4_cost * Decimal('5') # 合成1个等级5
# 计算各等级单位等级1物品的贡献
unit_contribution_level2 = Decimal('1') / level2_cost
unit_contribution_level3 = Decimal('1') / level3_cost
unit_contribution_level4 = Decimal('1') / level4_cost
unit_contribution_level5 = Decimal('1') / level5_cost
# 计算单位等级1物品对等级5的期望贡献
total_unit_contribution = unit_contribution_level5
# 计算所需等级1物品数量
min_level1_items = target_expectation / total_unit_contribution
# 返回向上取整的结果(因为物品数量必须为整数)
return min_level1_items.to_integral_exact(rounding='ROUND_CEILING')
# 调用函数
result = calculate_min_level1_items()
print(f"获得0.75个等级五物品至少需要的等级一物品数量: {result}")
結果是:
获得0.75个等级五物品至少需要的等级一物品数量: 469
(不能編輯帖子真的好麻煩)💦
离线
看到又是概率題就知道完蛋了
換了好幾個ai,但是不同會話算出來的值差幾千,甚至有小於81的(倒是祕塔爆冷給了個625的期望值,很接近模擬),果然國內這方面還趕不上,最後得老老實實自己算。一通數學+玄學計算配合模擬程序迭代10000次算出來的629期望值得出最終答案740,和前兩題比感覺底氣嚴重不足......
EDIT:更正爲1250。反正兩個答案過程都挺玄乎的
EDIT2:更改爲787……
這次就是自己敲的暴力近似了:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CYCLES 300000
#define LIMIT 785
void level_up(int* low_level_list, int* low_level_count, int* high_level_list, int* high_level_count) {
if (*low_level_count == 3) {
int a = rand() % 2;
if (a) {
high_level_list[*high_level_count] = 1;
(*high_level_count)++;
*low_level_count = 0;
} else {
*low_level_count -= 2;
}
}
}
int main() {
srand(time(NULL)); // 初始化隨機數種子
int sum_high = 0;
for (int i = 0; i < CYCLES; i++) {
int list_1[3] = {0};
int list_2[3] = {0};
int list_3[3] = {0};
int list_4[3] = {0};
int list_5[1] = {0};
int count_1 = 0, count_2 = 0, count_3 = 0, count_4 = 0, count_5 = 0;
int sum_low = 0;
while (count_5 != 1) {
list_1[count_1] = 1;
count_1++;
sum_low++;
level_up(list_1, &count_1, list_2, &count_2);
level_up(list_2, &count_2, list_3, &count_3);
level_up(list_3, &count_3, list_4, &count_4);
level_up(list_4, &count_4, list_5, &count_5);
}
if (sum_low < LIMIT) {
sum_high++;
}
}
printf("total sum=%.6f\n", (double)sum_high / CYCLES);
return 0;
}
EDIT3:更換爲C語言增強性能並增加迭代數and修正原本代碼的bug。最小值應該是784。
最后修改: 羽落 (2025-01-12 22:27:05)
若有謬誤,務必告知。
离线