2016-09-08 12 views
0

こんにちは私はvb.netで関数を作成して、ランダムに生成された色を作成して、フォーム上のListViewの行を強調表示しようとしています。コードへの入力は、バイトであるSlaveIDです。私が抱えている問題は、同じSlaveIDを複数回入力すると、常に同じカラー出力が得られることです。 Rndは数字をランダムにするために現在の時間を取っているので、入力値が変わらなくてもこの関数を呼び出すたびに色出力が変わります。 Rndの簡単な置き換えになる時間によって影響を受けない乱数生成器はありますか?ランダムな色を作成してvb.netのテキストを強調表示する

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 

エンド機能

答えて

2

同じ擬似乱数を毎回生成するには、次のことができRandomize

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 
1

Rndを使用する前に、あなたは現在の時間以外のもので乱数ジェネレータをシードするxの一貫性のある値でRandomize(x)を呼び出すことができます。 GetColourForRowの上部にこれを行うことをお勧めします。詳細については

は、以下を参照してください。あなたのプログラムの別の場所で乱数を使用している場合

https://msdn.microsoft.com/en-us/library/8zedbtdt(v=vs.90).aspx

しかし、これは意図しない副作用を有することができます。 MD5やSHAなどのハッシュ関数を使用して、SlaveIDを一貫してランダムなバイトにマップする方が適切な場合があります。同じシードで

0

ここで私は

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 

エンド機能

@Slaiの答えを使って書いたコードがあります
0

古いVisual BasicではなくVisual Basic .NETを使用しているので、フレームワークのRandom classを使用することをお勧めします。だから、あなたに

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 
を与えるだろう

...それが存在するためのがOOPを使ってみましょう

関連する問題