小儿无赖 发表于 2023-8-19 09:10:36

代码求助

"""洗牌算法"""
import random

#定义函数
def fy_shuffle(x, y):
    n = len(x)
    v = []
    for j in range(y):
      for i in range(n):
            z = random.randint(1, n-i)
            v.append(x)
            x = x[:z-2] + x
      print(f"第{y}次打乱后的结果:{z}")
      x = v
      v = []
    print(f"最终的结果是:{x}")
   
#主体程序
x = input("请输入要打乱的序列:")
y = int(input("请输入要打乱的次数:"))
fy_shuffle(x, y)
创建一个打乱序列的函数,有两个参数,x 是要打乱的序列, y是打乱的次数。
求大佬帮助修改一下代码。

陶远航 发表于 2023-8-19 09:11:22

你的代码存在一些问题,我已经为你做了修改,具体修改如下:

import random

def fy_shuffle(x, y):
    n = len(x)
    v = x[:]# 创建一个副本以避免修改原始序列
    for j in range(y):
      for i in range(n):
            z = random.randint(0, n-i-1)
            v[ i], v = v, v[ i]# 交换位置
    print(f"第{y}次打乱后的结果: {v}")
    return v

x = input("请输入要打乱的序列:")
y = int(input("请输入要打乱的次数:"))
fy_shuffle(list(x), y)


修改后的代码主要包括以下几个改动:

1. 在函数开始时,使用x[:]创建了一个副本v,这样函数内部对v的修改不会影响到原始的输入序列x。

2. 在内循环中,使用random.randint(0, n-i-1)生成随机索引z时,上限应该是n-i-1而不是 n-i。

3. 在交换元素时,使用v[ i], v = v, v[ i]进行位置交换。

4. 打印最终结果时,使用print(f"第{y}次打乱后的结果: {v}")输出打乱后的结果。

您可以将要打乱的序列作为字符串输入,然后代码会将其转换为列表进行处理。请注意,fy_shuffle函数会返回打乱后的结果,您可以根据需要进行进一步的处理或输出。

希望这能帮到您!如果还有其他问题,请随时向我提问。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-19 09:11:24

洗牌算法 Python代码修改

以下是你提供的代码,我进行了修改和完善:

import random

def fy_shuffle(x, y):
    x = list(x)# 将输入的序列转换为列表形式
    n = len(x)
    for _ in range(y):
      v = []
      for i in range(n, 0, -1):
            z = random.randint(0, i-1)
            v.append(x)
            x, x = x, x
      print(f"第{_+1}次打乱后的结果: {''.join(v)}")
      x = v
    print(f"最终的结果是: {''.join(x)}")

x = input("请输入要打乱的序列:")
y = int(input("请输入要打乱的次数:"))
fy_shuffle(x, y)


我对代码进行了如下修改和说明:
1. 添加了 list(x),将输入的序列转换为列表形式,以方便后续操作。
2. 在循环中使用 for _ in range(y) 来代替 for j in range(y),并且使用 _+1 来表示当前是第几次打乱。
3. 在内层循环中,使用 for i in range(n, 0, -1) 并配合 x, x = x, x 来实现元素交换,从而达到洗牌的目的。
4. 修改了打印语句,输出每次打乱后的结果。

以上是修改后的完整代码。希望对你有所帮助!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-19 09:12:00

问题分析:
这段代码是一个洗牌算法,通过随机选择元素的方式实现打乱序列。但是在实现过程中存在一些问题。

问题解决:
以下是修改后的代码:

import random

# 定义函数
def fy_shuffle(x, y):
    n = len(x)
    v = []
    for j in range(y):
      for i in range(n):
            z = random.randint(0, n-i-1)# 修改此行,使得随机数范围正确
            v.append(x)
            x = x[:z] + x# 修改此行,使得切片操作正确
      print(f"第{y}次打乱后的结果:{v}")# 修改此行,打印结果应为v
      x = v
      v = []
    print(f"最终的结果是:{x}")

# 主体程序
x = list(input("请输入要打乱的序列:"))# 修改此行,将输入的字符串转换为列表
y = int(input("请输入要打乱的次数:"))
fy_shuffle(x, y)


修改说明:
1. 在随机选择元素的过程中,原代码使用的是 random.randint(1, n-i) ,但是正确的范围应该是 random.randint(0, n-i-1) ,因为列表的索引是从0开始的。
2. 在删除已选择的元素时,原代码使用的是 x = x[:z-2] + x ,但是这样会导致元素删除不正确。正确的方式是使用 x = x[:z] + x ,即将要删除的元素前后的子序列连接起来。
3. 在打印结果时,原代码使用的是 print(f"第{y}次打乱后的结果:{z}") ,但是应该打印的是打乱后的序列 v ,即 print(f"第{y}次打乱后的结果:{v}") 。
4. 在主体程序中,原代码使用的是 x = input("请输入要打乱的序列:") ,但是这样得到的是一个字符串,而不是一个列表。修改后的代码使用 x = list(input("请输入要打乱的序列:")) ,将输入的字符串转换为列表。

小儿无赖 发表于 2023-8-19 09:13:39

陶远航 发表于 2023-8-19 09:11
你的代码存在一些问题,我已经为你做了修改,具体修改如下:




不是交换元素,是随机打乱

陶远航 发表于 2023-8-19 09:14:56

小儿无赖 发表于 2023-8-19 09:13
不是交换元素,是随机打乱

参考isdkz的代码
页: [1]
查看完整版本: 代码求助