2017-10-12 118 views
0

我为VB.net如何重复后随机排列索引列表(串),超出范围

一个新手程序员

所以我一直停留在这个代码,这是随机名称生成。

Private Function RandomLname(ByRef ranLname As String) As String 
 

 
     Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader("[pathto file.txt]", Encoding.Default) 
 
     Dim lines As New List(Of String) 
 
     Dim rnd As New Random() 
 
     Dim line As Integer 
 
     While reader.Peek <> -1 
 
      lines.Add(reader.ReadLine()) 
 
     End While 
 

 
     line = rnd.Next(lines.Count + 1) 
 
     'the error shown in this line 
 
     ranLname = lines(line) 
 
     Return ranLname 
 
     reader.Close() 
 
     reader.Dispose() 
 

 
    End Function

我不断收到ArgumentOutOfRangeException异常几年运行后,任何人都可以帮助我吗? 我需要脚本从头再次读取列表,当它到达list.count任何人都可以有想法?

任何帮助,将不胜感激。

+0

尝试'线= rnd.Next(lines.Count)'。 – Enigmativity

+0

你的代码有一个主要的缺陷,那就是你在'Return'语句之后关闭了文本文件,即你根本没有关闭它。您应该使用'Using'语句打开它,然后隐式关闭它,而不管该方法如何结束。 – jmcilhinney

+0

我已经删除了reader.Close()和reader.Dispose(),但它不会重新排列列表。即使当我删除(+ 1)列表不会产生任何结果60 +结果书面 – Hyuichiro

回答

1

此:

line = rnd.Next(lines.Count + 1) 

应该是这样的:

line = rnd.Next(lines.Count) 

主叫Random.Next和集合中的最大索引大于Count少1时的上限是排他性的。

+0

当上限达到时,我可以做些什么来重新从头开始读取列表?坚持这一点。因为我的名单中包含了148个名字,而且我随机使用了两个名字作为情侣。但是在60对夫妇之后,它应该在74对夫妻中完成。任何想法? – Hyuichiro

+0

如果你有一个新的问题要问,然后问一个新的问题。不要捎带到这一个。 – jmcilhinney

0

试试这个:

Private Function RandomLname() As String 

    Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader("[pathto file.txt]", Encoding.Default) 
    Dim lines As New List(Of String) 
    Dim rnd As New Random() 
    Dim line As Integer 
    While reader.Peek <> -1 
     lines.Add(reader.ReadLine()) 
    End While 

    line = rnd.Next(lines.Count) 
    Return lines(line) 
    reader.Close() 
    reader.Dispose() 

End Function 

这里有一个简单的实现你:

Private rnd As New Random() 
Private Function RandomLname() As String 
    Return File.ReadAllLines("[pathto file.txt]").OrderBy(Function(x) rnd.Next()).FirstOrDefault() 
End Function