2

所以基本上,我有这个函数应该在一个高数和一个低数之间生成两个随机整数,以在表格上指出一个点。我知道 Random 可以处理这个问题,但是 Random 具有一致性,而我需要表格上的数字是完全随机的。

例如,我生成的大部分点都出现在对角线上。这是我想要避免的。它应该遍及高低数字之间的表格。

这是我当前的功能:

Function GetNewLocation() As Point
    Randomize()
    Dim int1 As Integer = RandomNumber(6, 345)
    Randomize()
    Dim int2 As Integer = RandomNumber(35, 286)
    Return New Point(int1, int2)
End Function

Function RandomNumber(ByVal low As Integer, ByVal high As Integer) As Integer
    Randomize()
    Return New Random().Next(low, high)
End Function

如何在点不在对角线上的情况下生成真正的随机数?

4

5 回答 5

5

每次创建新实例时,Random都会重置随机数生成器。由于默认构造函数Environment.TickCount用作种子,因此您通常会返回完全相同的伪随机数序列。系统不会TickCount经常更新。这就是为什么在您看来,您得到的是非随机数字。

尝试像这样更改您的代码:

Private _rnd As New Random()
Function RandomNumber(ByVal low As Integer, ByVal high As Integer) As Integer
    Return _rnd.Next(low, high)
End Function
于 2013-10-30T02:24:54.027 回答
0

计算机系统中没有真正的随机性。有许多算法可以生成“随机”数字,但它们总是基于种子,例如时间、进程 ID、两者的混合,或者更高级的随机性被重视的情况,在麦克风中检测到的声音,来自大气传感器或宇宙微波背景的数据,但它总是来自一些现有的信息源。

于 2013-10-30T01:59:25.407 回答
0

那也不是最好的解决方案。我更喜欢我自己的代码:

 Dim old As Integer = 6572
Public Function Rand(ByVal min As Integer, ByVal max As Integer) As Integer
    Dim random As New Random(old + Date.Now.Millisecond)
    old = random.Next(min, max + CInt(IIf(Date.Now.Millisecond Mod 2 = 0, 1, 0)))
    Return old
End Function

那好一点

于 2015-10-23T15:34:20.067 回答
0

在java中(假设限制是(limit-1)):

random  = System.currentTimeMillis()%limit;

你明白了:)

于 2020-02-04T03:55:20.887 回答
0

我真的只是想出了这个解决方案。也许会有所帮助=)

我来自:

Dim rand As Random = New Random(DateTime.Now.Millisecond)

Dim rand As Random = New Random(DateTime.Now.Millisecond * DateTime.Now.Second * DateTime.Now.Minute * DateTime.Now.Hour)

它似乎运作得非常好。您可以并排看到差异。

随机比较

于 2016-01-25T03:52:40.127 回答