Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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中创建一种随机颜色以高亮显示文本_Vb.net_Random - Fatal编程技术网

在vb.net中创建一种随机颜色以高亮显示文本

在vb.net中创建一种随机颜色以高亮显示文本,vb.net,random,Vb.net,Random,您好,我正在尝试在vb.net中创建一个函数,以创建一个随机生成的颜色来突出显示窗体上ListView中的行。代码的输入是SlaveID,它是一个字节。我遇到的问题是,如果我多次输入相同的SlaveID,我将始终获得相同的颜色输出。由于Rnd占用当前时间使数字更随机,因此每次调用此函数时,颜色输出都会发生变化,即使输入值保持不变。是否有一个不受时间影响的随机数发生器可以轻松替代Rnd Private Function GetColourForRow(ByVal SlaveID As Byte)

您好,我正在尝试在vb.net中创建一个函数,以创建一个随机生成的颜色来突出显示窗体上ListView中的行。代码的输入是SlaveID,它是一个字节。我遇到的问题是,如果我多次输入相同的SlaveID,我将始终获得相同的颜色输出。由于Rnd占用当前时间使数字更随机,因此每次调用此函数时,颜色输出都会发生变化,即使输入值保持不变。是否有一个不受时间影响的随机数发生器可以轻松替代Rnd

Private Function GetColourForRow(ByVal SlaveID As Byte)
    Dim ListViewItemColour As New ListViewItem        
    Dim upperbound As Byte = 255
    Dim lowerbound As Byte = 100
    Dim ColourA As Int16 = CInt(Math.Floor((upperbound * 2 - lowerbound + 1) * Rnd(SlaveID) + 2)) + lowerbound
    Dim ColourR As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd(SlaveID))) + lowerbound
    Dim ColourG As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd(SlaveID + 5))) + lowerbound
    Dim ColourB As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd(SlaveID + 15))) + lowerbound        

Return ListViewItemColour.BackColor

结束函数

在使用
Rnd
之前,您可以使用一致的
x
值调用
Randomize(x)
,以使用除当前时间之外的其他内容为随机数生成器设定种子。您可能希望在
getcolorforrow
的顶部执行此操作

有关详细信息,请参阅:


但是,如果在程序的其他地方使用随机数,这可能会产生意外的副作用。使用诸如MD5或SHA之类的散列函数将SlaveID一致地映射到一些看起来随机的字节可能更合适。

在使用
Rnd
之前,您可以使用一致的
x
值调用
Randomize(x)
,以使用当前时间以外的内容为随机数生成器种子。您可能希望在
getcolorforrow
的顶部执行此操作

有关详细信息,请参阅:


但是,如果在程序的其他地方使用随机数,这可能会产生意外的副作用。使用诸如MD5或SHA之类的散列函数将SlaveID一致地映射到一些看起来随机的字节可能更合适。

要每次生成相同的伪随机数,可以使用相同的种子:

 Private Function GetColourForRow(ByVal SlaveID As Byte)
    Static seed# = Rnd() ' Static values will be set only the first time the function is called and will stay the same
    Randomize(seed)
    ' the rest of the code

要每次生成相同的伪随机数,可以使用相同的种子:

 Private Function GetColourForRow(ByVal SlaveID As Byte)
    Static seed# = Rnd() ' Static values will be set only the first time the function is called and will stay the same
    Randomize(seed)
    ' the rest of the code

下面是我使用@Slai-answer编写的代码

Private Function GetColourForRow(ByVal MessageID As Byte)
    Dim ListViewItemColour As New ListViewItem
    'MessageID = MessageID + (ListViewPosition / 2)
    Dim ModValue As Byte = MessageID Mod 8

    Dim upperbound As Byte = 255
    Dim lowerbound As Byte = 100

    Dim RandomA As New Random(MessageID * 100000)
    Dim RandomR As New Random((MessageID + 10) * 5000)
    Dim RandomG As New Random((MessageID + 5) * 80000)
    Dim RandomB As New Random((MessageID + 15) * 90000)




    'upperbound is multiplied by two since it is brightness. needs to be larger
    Dim ColourA As Int16 = CInt(Math.Floor((upperbound * 2 - lowerbound + 1) * RandomA.NextDouble) + lowerbound)
    Dim ColourR As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * RandomR.NextDouble) + lowerbound)
    Dim ColourG As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * RandomG.NextDouble) + lowerbound)
    Dim ColourB As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * RandomB.NextDouble) + lowerbound)

    If ColourA > 255 Or ColourA < 0 Then ColourA = 255
    If ColourR > 255 Or ColourR < 0 Then ColourR = 255
    If ColourB > 255 Or ColourB < 0 Then ColourB = 255
    If ColourG > 255 Or ColourG < 0 Then ColourG = 255


    ListViewItemColour.BackColor = Color.FromArgb(ColourA, ColourR, ColourB, ColourG)
    Return ListViewItemColour.BackColor
私有函数getcolorforrow(ByVal MessageID作为字节)
将ListViewItemColor暗显为新ListViewItem
'MessageID=MessageID+(ListViewPosition/2)
Dim ModValue作为字节=消息ID Mod 8
尺寸上限为字节=255
Dim lowerbound作为字节=100
将随机数调整为新随机数(MessageID*100000)
作为新随机变量的随机变量((MessageID+10)*5000)
Dim RandomG作为新随机((MessageID+5)*80000)
Dim RandomB作为新随机((MessageID+15)*90000)
'上限乘以2,因为它是亮度。需要更大一些
调暗颜色,如Int16=CInt(数学地板((上界*2-下界+1)*随机下界)+下界)
暗显色器,如Int16=CInt(数学地板((上界-下界+1)*随机下界)+下界)
调暗颜色为Int16=CInt(数学地板((上界-下界+1)*随机下界)+下界)
调暗颜色B为Int16=CInt(数学地板((上界-下界+1)*随机B.NextDouble)+下界)
如果colorA>255或colorA<0,则colorA=255
如果Colorr>255或Colorr<0,则Colorr=255
如果colorB>255或colorB<0,则colorB=255
如果colorg>255或colorg<0,则colorg=255
ListViewItemColor.BackColor=Color.FromArgb(colorA、colorR、colorB、colorG)
返回ListViewItemColor.BackColor

End Function

以下是我使用@Slai answer编写的代码

Private Function GetColourForRow(ByVal MessageID As Byte)
    Dim ListViewItemColour As New ListViewItem
    'MessageID = MessageID + (ListViewPosition / 2)
    Dim ModValue As Byte = MessageID Mod 8

    Dim upperbound As Byte = 255
    Dim lowerbound As Byte = 100

    Dim RandomA As New Random(MessageID * 100000)
    Dim RandomR As New Random((MessageID + 10) * 5000)
    Dim RandomG As New Random((MessageID + 5) * 80000)
    Dim RandomB As New Random((MessageID + 15) * 90000)




    'upperbound is multiplied by two since it is brightness. needs to be larger
    Dim ColourA As Int16 = CInt(Math.Floor((upperbound * 2 - lowerbound + 1) * RandomA.NextDouble) + lowerbound)
    Dim ColourR As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * RandomR.NextDouble) + lowerbound)
    Dim ColourG As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * RandomG.NextDouble) + lowerbound)
    Dim ColourB As Int16 = CInt(Math.Floor((upperbound - lowerbound + 1) * RandomB.NextDouble) + lowerbound)

    If ColourA > 255 Or ColourA < 0 Then ColourA = 255
    If ColourR > 255 Or ColourR < 0 Then ColourR = 255
    If ColourB > 255 Or ColourB < 0 Then ColourB = 255
    If ColourG > 255 Or ColourG < 0 Then ColourG = 255


    ListViewItemColour.BackColor = Color.FromArgb(ColourA, ColourR, ColourB, ColourG)
    Return ListViewItemColour.BackColor
私有函数getcolorforrow(ByVal MessageID作为字节)
将ListViewItemColor暗显为新ListViewItem
'MessageID=MessageID+(ListViewPosition/2)
Dim ModValue作为字节=消息ID Mod 8
尺寸上限为字节=255
Dim lowerbound作为字节=100
将随机数调整为新随机数(MessageID*100000)
作为新随机变量的随机变量((MessageID+10)*5000)
Dim RandomG作为新随机((MessageID+5)*80000)
Dim RandomB作为新随机((MessageID+15)*90000)
'上限乘以2,因为它是亮度。需要更大一些
调暗颜色,如Int16=CInt(数学地板((上界*2-下界+1)*随机下界)+下界)
暗显色器,如Int16=CInt(数学地板((上界-下界+1)*随机下界)+下界)
调暗颜色为Int16=CInt(数学地板((上界-下界+1)*随机下界)+下界)
调暗颜色B为Int16=CInt(数学地板((上界-下界+1)*随机B.NextDouble)+下界)
如果colorA>255或colorA<0,则colorA=255
如果Colorr>255或Colorr<0,则Colorr=255
如果colorB>255或colorB<0,则colorB=255
如果colorg>255或colorg<0,则colorg=255
ListViewItemColor.BackColor=Color.FromArgb(colorA、colorR、colorB、colorG)
返回ListViewItemColor.BackColor

结束函数

因为您使用的是Visual Basic.NET而不是旧的Visual Basic,所以我建议您使用框架的。让我们使用OOP,因为它存在

那会给你

Public Class MyClass
  'We will instanciate the Random number generator using a seed
  Private _seed As Integer = CInt(Date.Now.Ticks And &h0000FFFF)

  Private Function GetColourForRow(ByVal SlaveID As Byte)
    Dim Random As New Random(_seed)

    'These numbers will always be the same, because the seed will not change...
    Dim number1 = Random.Next(minimum, maximum)
    Dim number2 = Random.Next(minimum, maximum)

    'Rest of your function
  End Function

  'Rest of your class
End Class

因为您使用的是VisualBasic.NET,而不是旧的VisualBasic,所以我建议您使用框架的。让我们使用OOP,因为它存在

那会给你

Public Class MyClass
  'We will instanciate the Random number generator using a seed
  Private _seed As Integer = CInt(Date.Now.Ticks And &h0000FFFF)

  Private Function GetColourForRow(ByVal SlaveID As Byte)
    Dim Random As New Random(_seed)

    'These numbers will always be the same, because the seed will not change...
    Dim number1 = Random.Next(minimum, maximum)
    Dim number2 = Random.Next(minimum, maximum)

    'Rest of your function
  End Function

  'Rest of your class
End Class