Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET-在string.replace方法中使用函数调用随机化()_Vb.net_String_Random_Replace - Fatal编程技术网

VB.NET-在string.replace方法中使用函数调用随机化()

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

我有一个聊天系统,我想放一个“随机字符串生成器”

在我的聊天中,我必须写入“%random%”,它被替换为一个随机字符串

但我有一个问题,例如,如果我键入“%random%%random%%random%”,它将生成相同的字符串3次

•以下是我的职能:

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方法一样。