如何用因子打乱一个单词?
我想把一个单词打乱,打乱的程度可以通过一个因子来决定。因子越大,单词就会打乱得越厉害。
比如说,单词“paragraphs”如果因子是1.00,就会变成“paaprahrgs”;如果因子是0.50,则会变成“paargarphs”。
在打乱的时候,需要考虑字母原来的位置和被打乱的字母数量。
这是我目前写的代码,它只是简单地打乱,没有考虑因子:
def Scramble(s):
return ''.join(random.sample(s, len(s)))
有没有什么好的想法呢?
顺便说一下,这不是作业,我想做的东西类似于这个:http://d24w6bsrhbeh9d.cloudfront.net/photo/190546_700b.jpg
5 个回答
1
你可以把“因子”理解为两个相邻字母交换位置的次数,也就是一次“位置交换”。
在每次交换中,随机选择一个位置(从0到单词长度减去2),然后把这个位置的字母和它后面的字母交换位置。
2
你没有说明你的“因子”应该是什么意思,所以让我来给你重新定义一下:一个搅拌因子 N(一个整数)就是在一个单词中随机交换两个字母,交换 N 次后的结果。
根据这个定义,0 表示结果单词和输入的单词是一样的,1 表示只交换了一对字母,而 10 则表示交换了 10 次。
3
你可以把这个因子当作在字符串中随机打乱字符的数量。因为这个因子的值通常在0到1之间,所以你可以把它和字符串的长度相乘。
from random import random
def shuffle(string, factor):
string = list(string)
length = len(string)
if length < 2:
return string
shuffles = int(length * factor)
for i in xrange(shuffles):
i, j = tuple(int(random() * length) for i in xrange(2))
string[i], string[j] = string[j], string[i]
return "".join(string)
x = "computer"
print shuffle(x, .2)
print shuffle(x, .5)
print shuffle(x, .9)
coupmter
eocpumtr
rpmeutoc
如果你想让第一个和最后一个字符保持不动,只需要把它们分开,然后最后再加上去就可以了。
def CoolWordScramble(string, factor = .5):
if len(string) < 2:
return string
first, string, last = string[0], string[1:-1], string[-1]
return first + shuffle(string, factor) + last