如何用因子打乱一个单词?

0 投票
5 回答
1370 浏览
提问于 2025-04-16 23:05

我想把一个单词打乱,打乱的程度可以通过一个因子来决定。因子越大,单词就会打乱得越厉害。

比如说,单词“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

撰写回答