Skip to content

Commit 8bd0435

Browse files
authored
🌐 [translation-sync] [functions.md] Update np.random → Generator API (#61)
* Update translation: lectures/functions.md * Update translation: .translate/state/functions.md.yml
1 parent 52655a1 commit 8bd0435

2 files changed

Lines changed: 27 additions & 27 deletions

File tree

.translate/state/functions.md.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
source-sha: 1f13005646e1f9241baccf1f6e79dff1924043dd
2-
synced-at: "2026-03-20"
1+
source-sha: 1b356ab5e60d8f6939446fd5f47c243593a2abd3
2+
synced-at: "2026-05-04"
33
model: claude-sonnet-4-6
4-
mode: NEW
4+
mode: UPDATE
55
section-count: 7
6-
tool-version: 0.13.0
6+
tool-version: 0.14.1

lectures/functions.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ type(22)
100100

101101
Python 内置函数的完整列表在[这里](https://docs.python.org/3/library/functions.html)
102102

103-
104103
### 第三方函数
105104

106105
如果内置函数不能满足我们的需求,我们要么需要导入函数,要么创建自己的函数。
@@ -280,7 +279,6 @@ quad(lambda x: x**3, 0, 2)
280279

281280
这里由 `lambda` 创建的函数被称为*匿名*函数,因为它从未被赋予名称。
282281

283-
284282
### 为什么要编写函数?
285283

286284
用户自定义函数对于提高代码的清晰度非常重要,通过
@@ -294,16 +292,19 @@ quad(lambda x: x**3, 0, 2)
294292

295293
## 应用
296294

295+
297296
### 随机抽取
298297

299-
再次考虑{doc}`前一讲 <python_by_example>`中的以下代码
298+
再次考虑 {doc}`前一讲 <python_by_example>` 中的以下代码
300299

301300
```{code-cell} python3
301+
rng = np.random.default_rng()
302+
302303
ts_length = 100
303304
ϵ_values = [] # 空列表
304305
305306
for i in range(ts_length):
306-
e = np.random.randn()
307+
e = rng.standard_normal()
307308
ϵ_values.append(e)
308309
309310
plt.plot(ϵ_values)
@@ -324,7 +325,7 @@ plt.show()
324325
def generate_data(n):
325326
ϵ_values = []
326327
for i in range(n):
327-
e = np.random.randn()
328+
e = rng.standard_normal()
328329
ϵ_values.append(e)
329330
return ϵ_values
330331
@@ -354,9 +355,9 @@ def generate_data(n, generator_type):
354355
ϵ_values = []
355356
for i in range(n):
356357
if generator_type == 'U':
357-
e = np.random.uniform(0, 1)
358+
e = rng.uniform(0, 1)
358359
else:
359-
e = np.random.randn()
360+
e = rng.standard_normal()
360361
ϵ_values.append(e)
361362
return ϵ_values
362363
@@ -376,7 +377,7 @@ plt.show()
376377

377378
现在,有几种方法可以简化上面的代码。
378379

379-
例如,我们可以完全去掉条件判断,只需将所需的生成器类型*作为函数*传递
380+
例如,我们可以完全去掉条件判断,只需将所需的生成器类型作为函数、方法或其他 [可调用](https://typing.python.org/en/latest/spec/callables.html) 对象传递
380381

381382
要理解这一点,请考虑以下版本。
382383

@@ -389,18 +390,18 @@ def generate_data(n, generator_type):
389390
ϵ_values.append(e)
390391
return ϵ_values
391392
392-
data = generate_data(100, np.random.uniform)
393+
data = generate_data(100, rng.uniform)
393394
plt.plot(data)
394395
plt.show()
395396
```
396397

397-
现在,当我们调用函数 `generate_data()` 时,我们将 `np.random.uniform` 作为第二个参数传递。
398+
现在,当我们调用函数 `generate_data()` 时,我们将 `rng.uniform` 作为第二个参数传递。
398399

399-
这个对象是一个*函数*
400+
这个对象是一个*可调用对象*——即可以使用括号调用的对象
400401

401-
当函数调用 `generate_data(100, np.random.uniform)` 被执行时,Python 以 `n` 等于 100 和名称 `generator_type` "绑定"到函数 `np.random.uniform` 来运行函数代码块。
402+
当函数调用 `generate_data(100, rng.uniform)` 被执行时,Python 以 `n` 等于 100 和名称 `generator_type` "绑定"到可调用对象 `rng.uniform` 来运行函数代码块。
402403

403-
* 在这些行被执行时,名称 `generator_type``np.random.uniform` 是"同义词",可以以相同的方式使用。
404+
* 在这些行被执行时,名称 `generator_type``rng.uniform` 是"同义词",可以以相同的方式使用。
404405

405406
这个原则更普遍地适用——例如,考虑以下代码
406407

@@ -415,7 +416,7 @@ m(7, 2, 4)
415416

416417
这里我们为内置函数 `max()` 创建了另一个名称,然后可以以相同的方式使用它。
417418

418-
在我们程序的背景下,将新名称绑定到函数的能力意味着*将函数作为参数传递给另一个函数*没有任何问题——正如我们上面所做的那样
419+
在我们程序的背景下,将名称绑定到函数或更一般地绑定到可调用对象的能力,意味着将一个可调用对象作为参数传递给另一个可调用对象没有任何问题——正如我们上面使用 `rng.uniform` 所做的那样
419420

420421

421422
(recursive_functions)=
@@ -518,7 +519,7 @@ factorial(4)
518519

519520
[二项随机变量](https://en.wikipedia.org/wiki/Binomial_distribution) $Y \sim Bin(n, p)$ 表示 $n$ 次二元试验中的成功次数,其中每次试验以概率 $p$ 成功。
520521

521-
除了 `from numpy.random import uniform` 之外不使用任何其他导入,编写一个函数
522+
使用 `rng = np.random.default_rng()`,编写一个函数
522523
`binomial_rv`,使得 `binomial_rv(n, p)` 生成 $Y$ 的一次抽取。
523524

524525
```{hint}
@@ -538,12 +539,12 @@ factorial(4)
538539
这是一种解法:
539540

540541
```{code-cell} python3
541-
from numpy.random import uniform
542+
rng = np.random.default_rng()
542543
543544
def binomial_rv(n, p):
544545
count = 0
545546
for i in range(n):
546-
U = uniform()
547+
U = rng.uniform()
547548
if U < p:
548549
count = count + 1 # 或者 count += 1
549550
return count
@@ -569,7 +570,7 @@ binomial_rv(10, 0.5)
569570

570571
- 如果在此序列中正面出现 `k` 次或更多次,支付一美元。
571572

572-
除了 `from numpy.random import uniform` 之外不使用任何其他导入
573+
使用 `rng = np.random.default_rng()` 来生成随机数
573574

574575
```{exercise-end}
575576
```
@@ -584,15 +585,15 @@ binomial_rv(10, 0.5)
584585

585586

586587
```{code-cell} python3
587-
from numpy.random import uniform
588+
rng = np.random.default_rng()
588589
589590
def draw(k): # 如果序列中连续成功 k 次则支付
590591
591592
payoff = 0
592593
count = 0
593594
594595
for i in range(10):
595-
U = uniform()
596+
U = rng.uniform()
596597
count = count + 1 if U < 0.5 else 0
597598
print(count) # 打印计数以便清楚
598599
if count == k:
@@ -612,7 +613,7 @@ def draw_new(k): # 如果序列中成功 k 次则支付
612613
count = 0
613614
614615
for i in range(10):
615-
U = uniform()
616+
U = rng.uniform()
616617
count = count + ( 1 if U < 0.5 else 0 )
617618
print(count)
618619
if count == k:
@@ -626,7 +627,6 @@ draw_new(3)
626627
```{solution-end}
627628
```
628629

629-
630630
## 进阶练习
631631

632632
在以下练习中,我们将一起编写递归函数。
@@ -706,4 +706,4 @@ print([recursion_factorial(i) for i in range(1, 10)])
706706
```
707707

708708
```{solution-end}
709-
```
709+
```

0 commit comments

Comments
 (0)