webForumDet fria alternativet

Slumpa tal??

2 svar · 216 visningar · startad av slurken

slurkenMedlem sedan juni 200152 inlägg
#1

Om man har en funktion som returnerar ett slump tal. Om jag nu anropar den exempelvis 20 gånger vill jag att samma tal inte får returneras flera gånger. Jag vill alltså ha 20 olika tal.

Hur löser man detta på bästa sätt?

------------------
jag är inte där du är

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Du får väl ha en array där du lagrar talen och sedan får du göra en check när tar fram ett nytt tal. Ungefär

Dim numbers(19)
Dim i,j,r,unique

randomize
for i = 0 to 19
    unique = true
    do 
        r = yourrndfunction(yourrndparameters)
        if  i > 0 then
            for j = 0 to i - 1
                if r = numbers(j) then
                   unique = false
                   exit for
                end if
            next
        end if
        if  unique then
            exit do
        end if
        unique = true
    loop
    numbers(i) = r
next

------------------
essentitia preter non sans multiplicandum

PatrikBMedlem sedan mars 20002 836 inlägg
#3

hello,

denna slumpar fram x antal unika nummer från n antal nummer:

	'## -- returnerar en kommaterad sträng av unika nummer --
	Private Function getUniqueNo(ByVal HowManyNumbers, ByVal FromTotalNumbers) ' As String
		Dim m_strNumbers
		Dim m_intUniqueNo
		
		'## -- kolla så att antal unika nummer man vill ha inte
		'##    överstiger det antal nummer att välja från --
		If HowManyNumbers > FromTotalNumbers Then Exit Function

		m_strNumbers = ""
		
		Randomize
		
		For I = 1 To HowManyNumbers
			
			m_intUniqueNo = Cint((rnd*FromTotalNumbers) + 0.5)
			If InStr(m_strNumbers,"#" & m_intUniqueNo & ",") > 0 Then
				I = I - 1
			Else
				m_strNumbers = m_strNumbers & "#" & m_intUniqueNo & ","
			End If
		Next
		m_strNumbers = Replace(m_strNumbers,"#","")
		m_strNumbers = Left(m_strNumbers,Len(m_strNumbers) - 1)
		getUniqueNo = m_strNumbers
	End Function

Använd den så här:

'## -- hur många unika nummer som ska returneras --
intTotUniqueNo = 5 

'## -- hur många nummer att välja från --
intTotNo = 20

'## -- hämta 5 slumpade tal från 1 - 20 --
strUniqueNo = getUniqueNo(intTotUniqueNo, intTotNo)

Nu kan du lätt splitta upp den returnerade strängen:

arrNumbers = Split(strUniqueNo,",")

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

[Redigerat av PatrikB den 08 jun 2001]

127 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)