我实际上在实现一个带有字符移除功能的字符附加功能。我正在使用带有固定种子的伪随机数生成器。但是,最终的字符串看起来不像初始的字符串。
我检查了我的随机数组在追加函数和非追加函数中是否相同。附加功能与删除功能相同,但相反。
这是我的附加函数:
<html>
<body>
<button onclick="a()">Click</button>
<div id="a" class="class1">
<p>Hello Everyone</p>
</div>
</body>
</html>
这是我的去除功能:
Sub append(ByRef phrase As String)
Dim size_phrase As Integer = phrase.Length - 1
Dim i As Integer
Dim rdm_array(size_phrase) As Integer
'Dim result As String
Dim randVar As Random = New Random(seed_charac)
For i = 0 To size_phrase
rdm_array(i) = randVar.Next(1, size_phrase)
Next
Dim j As Integer
randVar = New Random()
For j = 0 To size_phrase
Dim rdm_Char As Char = Chr(randVar.Next(42, 123))
phrase = phrase.Insert(rdm_array(j), rdm_Char)
Next
End Sub
这是我的输出:
在传递这些函数前后,我将拥有相同的字符串
答案 0 :(得分:1)
您的代码将无法正常工作,因为您随机选择了索引,并且不确定如何添加新项目。这样,添加项目时使用的索引在删除项目时可能会有所不同,原因是后来的项目可能会在其之前修改字符串。这就是为什么您得到奇怪结果的原因。
我看到了按照相反的顺序删除它们的去向,但这仅在生成的索引是单调的情况下才有效。如果是这种情况,您可以通过以相反的顺序删除它们来安全地进行操作。因此,为了使函数正常工作,您必须先对rdm_array
进行排序,然后再将其用于append
或remove
字符。由于添加的字符会增加字符串的长度,并且已经选择了索引(基于字符串的长度!),因此我建议使用减少的索引(它会提供更多的随机结果)。
此外,我认为您还存在一些“一举一得”错误的问题。我不是VB管理员(C#更容易阅读;),但您不应从字符串的长度中减去1,而应从0
迭代到size - 1
。
将所有这些因素都考虑进去,最终方法应该是这样的:
Sub append(ByRef phrase As String)
Dim size_phrase As Integer = phrase.Length
Dim i As Integer
Dim rdm_array(size_phrase) As Integer
Dim randVar As Random = New Random(seed_charac)
For i = 0 To size_phrase - 1
rdm_array(i) = randVar.Next(1, size_phrase)
Next
Array.Sort(rdm_array)
Array.Reverse(rdm_array)
Dim j As Integer
randVar = New Random()
For j = 0 To size_phrase - 1
Dim rdm_Char As Char = Chr(randVar.Next(42, 123))
phrase = phrase.Insert(rdm_array(j), rdm_Char)
Next
End Sub
Sub remove(ByRef phrase As String)
Dim size_phrase As Integer = phrase.Length
Dim initialSize As Integer = size_phrase / 2
Dim i As Integer
Dim randVar As Random = New Random(seed_charac)
Dim rdm_array(initialSize) As Integer
For i = 0 To initialSize - 1
rdm_array(i) = randVar.Next(1, initialSize)
Next
Array.Sort(rdm_array)
Array.Reverse(rdm_array)
Dim j As Integer
For j = initialSize - 1 To 0 Step -1
phrase = phrase.Remove(rdm_array(j), 1)
Next
End Sub
最后一点,您的示例建议将其用于某种加密模块-如果是的话,请保持加密状态,以确保将几乎零值添加到要加密的字符串中。