VB.NET-在string.replace方法中使用函数调用随机化()
我有一个聊天系统,我想放一个“随机字符串生成器” 在我的聊天中,我必须写入“%random%”,它被替换为一个随机字符串 但我有一个问题,例如,如果我键入“%random%%random%%random%”,它将生成相同的字符串3次 •以下是我的职能:VB.NET-在string.replace方法中使用函数调用随机化(),vb.net,string,random,replace,Vb.net,String,Random,Replace,我有一个聊天系统,我想放一个“随机字符串生成器” 在我的聊天中,我必须写入“%random%”,它被替换为一个随机字符串 但我有一个问题,例如,如果我键入“%random%%random%%random%”,它将生成相同的字符串3次 •以下是我的职能: Public Function getRandomString(ByVal len As Integer) As String Randomize() Dim stringMap as string = "abcdefghijk
Public Function getRandomString(ByVal len As Integer) As String
Randomize()
Dim stringMap as string = "abcdefghijklmnopqrstuwvxyz0123456789"
Dim rndString As String = ""
Dim rnd As New Random()
For i As Integer = 0 To len - 1
Randomize()
rndString &= stringMap.Substring(rnd.Next(0, stringMap.Length), 1)
Next
Return rndString
End Function
•下面是我的函数调用:
Dim msg As String = "Random string: %random%%random%%random%"
msg = msg.Replace("%random%", getRandomString(8))
MsgBox(msg)
输出例如:随机字符串:5z15if725z15if725z15if72
我猜这是因为它将第一个返回值保存在内存中并粘贴它,我如何修复它
我必须自己制作一个string.replace函数吗?谢谢哦,不!你根本不该打电话来!随机性与VB的功能结合使用。在这里创建一个新的随机对象就足够了。每次都得到相同结果的原因是每次都在创建一个新的随机数。您应该重用同一对象以获得不同的结果
'Create the object once
Private Shared rnd As New Random()
Public Function getRandomString(ByVal len As Integer) As String
Dim stringMap as string = "abcdefghijklmnopqrstuwvxyz0123456789"
Dim rndString As String = ""
For i As Integer = 0 To len - 1
rndString &= stringMap.Substring(rnd.Next(0, stringMap.Length), 1)
Next
Return rndString
End Function
编辑:我意识到除了上述更改之外,您还需要为每个“%random%”调用getRandomString函数String.Replace
只调用函数一次,并将结果粘贴到所有地方。使用Regex,您可以执行以下操作:
msg = new Regex("%random%").Replace(input, Function (match) getRandomString(8))
一个简单的方法是找到第一个出现的“%random%”,替换它,然后根据需要重复
作为控制台应用程序编写:
Option Infer On
Module Module1
Dim rand As New Random
Public Function getRandomString(ByVal len As Integer) As String
Dim stringMap As String = "abcdefghijklmnopqrstuwvxyz0123456789"
Dim rndString As String = ""
For i As Integer = 0 To len - 1
rndString &= stringMap.Substring(rand.Next(0, stringMap.Length), 1)
Next
Return rndString
End Function
Function ReplaceRandoms(s As String) As String
Dim stringToReplace = "%random%"
Dim r = s.IndexOf(stringToReplace)
While r >= 0
s = s.Remove(r, stringToReplace.Length).Insert(r, getRandomString(stringToReplace.Length))
r = s.IndexOf(stringToReplace)
End While
Return s
End Function
Sub Main()
Dim msg As String = "Random string: %random%%random%%random%"
msg = ReplaceRandoms(msg)
Console.WriteLine(msg)
Console.ReadLine()
End Sub
End Module
老故事,永远不要在循环中调用随机化。看到这个C#但它是一样的,我担心你必须创建自己的替换。史蒂夫:谢谢你的提示,我尝试过删除/移动randomize()调用,并使用“Lock”方法,但我无法创建像c#the#u lotus那样的花括号块。你真的这么认为吗?这是个问题不幸的是,我尝试了这个,但它不起作用,同样的结果,尽管仍然有同样的结果。。该死的时钟:p不可能在某个地方随机化()来更改种子吗?更新了我的答案,这个问题与我的最新修复无关。我想我明白了,这是我的想法,但有一个例外,如果我写:msg=New Regex(“%random%”)。替换(msg,Function(match)return getRandomString(8))它抛出了一个异常,并告诉我,如果我改为编写msg=New Regex(“%random%”),则无法使用这些参数调用replace方法(很难将其从fr转换为en)。replace(msg,getRandomString(8))同一字符串出现3次,就像string.replace方法一样。