输入:
5个整数
A, B, X1, K, M
有一个random算法
Xn = (A * Xn-1 + B) % M
要输出第K到K+4的X结果
老老实实写了如下python代码,问如何优化?
~~~
A, B, X1, K, M = map(int, raw_input().split())
def myRand(seed):
return (A * seed + B) % M
seed = X1
for i in xrange(1, K+5):
if i > K-1:
print seed
seed = myRand(seed)
~~~
1
jiang42 2014-12-14 21:55:21 +08:00
不知道你想怎么优化?我能想到的就是map换成list comprehension。或者数学好的话把递归表达式直接写成直接求值的表达式。一般来说,O(n)的算法在实际生活中已经足够好了
|
2
czheo OP |
3
iloahz 2014-12-14 22:24:24 +08:00 via iPhone
可以写出来通项公式的样子,要是嫌麻烦用矩阵也行噻
|
5
akagi 2014-12-14 22:37:04 +08:00
同余吧 循环节是M 打个表出来 直接到里面取 —— 简单想了下 不一定对
|
6
akagi 2014-12-14 22:39:04 +08:00
好像不太对…… 再想想去
|
7
iloahz 2014-12-14 22:58:48 +08:00 via iPhone
|
9
akagi 2014-12-15 00:26:02 +08:00
@iloahz 不过考虑到随机数发生器的场景,M通常比较大就是了。
计算时还是通项比较靠谱, x_2 = a * x_1 + b; x_3 = a^2 * x_1 + b * a + b; ... x_k = [ a^k-1 * x_1 + b * (1+a+a^2+...) ]; 最后取个余得到结果,前面没影响。另外计算 (a^k-1)%M 和 右侧等比数列 可以用点小技巧,差不多这样。 |
10
whalegia 2014-12-15 04:28:24 +08:00
|
12
whalegia 2014-12-15 08:20:34 +08:00
其实我也觉得同项不太对
|
13
whalegia 2014-12-15 08:27:15 +08:00
但是我觉得答案里是有循环的,搞个 list 记录一下循环吧?
我去试试 |
14
akagi 2014-12-15 09:13:13 +08:00
@czheo
设 y_n = k * M + c; y_(n+1) = A * (k * M + c) + B; y_(n+2) = A^2 * (k * M + c) + A * B + B; => x_n = c; x_(n+1) = (A * x_n + B) % M; x_(n+2) = (A * [(A * x_n + B) % M] + B) % M = ... 核心在于求余满足分配率。 |
15
czheo OP akagi 百度说求余不符合分配律
|