存档

文章标签 ‘Python’

Python整数除法的正负号·真

2012年12月17日  5,317 views 2 条评论

时隔一天,我才发现之前那篇文章中有一个漏洞,那就是8/-3,按照文中逻辑:

在C中,如果做除法运算后,余数有多个选择(一般最多也就是两个),那么余数应该选择“更靠近0”的那个。

结果应该是商-3余-1。但实际结果是商-2余-2。这个我们可以通过一个简单的C++程序来验证一下:

C系列语言的整数除法

C系列语言的整数除法

所以,昨天这篇文章的全文其实都是错的……虽然分析的很有道理……

真实的情况是这样的:

整数除法,实际上就是在浮点数除法的基础上将商取整的过程。

对于浮点数除法,我们对商没有疑问,8 ÷ -3 = -2.666666…7,C系列和Python等脚本语言的结果是一致的。

但是如何取整呢?

当商为正数的时候,我们也没有疑问,即 整数除法当商为正数时我们将结果向小的的方向取整。所以 8/3的商2而不是3。

当商为负数的时候,C系列语言和Python等脚本语言对取整的方法有不同的看法:

  • C系列:对于C系列语言来说 整数除法当结果为负数时我们将商向靠近0的方向取整。所以8/-3的商是-2,因为-2比-3更靠近0;
  • Python系列:对于Python等脚本语言来说 整数除法当结果为负数时我们将商向靠近-∞的方向取整。所以8/-3的商是-3,因为-3比-2更靠近-∞。

如上,就是C系列语言与Python等脚本语言的整数除法商不一致的原因所在,大家在使用整数除法时一定要注意结果取整的方向。

原来的文章就不再贴了,只把原文链接放在这里,如果有兴趣可以去看下。

分类: 心得笔记 标签:

Python和C++中洗牌算法Shuffle的实现

2011年6月24日  10,097 views 3 条评论

洗牌,就是将有序的集合中的元素以随机的顺序重新排列。

今天本来是想复习一下几种排序算法的……因为没有随机样本,所以才想着要弄洗牌算法的。以前从来就没有想到过这个问题,今天是头一次接触到打乱顺序的算法。

本文的洗牌算法参考了fuqcool的文章

首先是Python

python语言非常高级,它的标准库已经实现了洗牌函数,在Random模块下有个Shuffle函数。
这是在Random.py中的函数原型。

def shuffle(self, x, random=None, int=int):
	"""x, random=random.random -> shuffle list x in place; return None.

	Optional arg random is a 0-argument function returning a random
	float in [0.0, 1.0); by default, the standard random.random.
	"""

	if random is None:
		random = self.random
	for i in reversed(xrange(1, len(x))):
		# pick an element in x[:i+1] with which to exchange x[i]
		j = int(random() * (i+1))
		x[i], x[j] = x[j], x[i]

阅读全文…