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