Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Liczby losowe i zapisywanie do pliku
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002
Liczby losowe i zapisywanie do pliku

Mam do Was dwa pytania:
1.) Potrzebuję generować liczby losowe, całkowite, NIEPOWTARZAJĄCE SIĘ, z określonego przedziału. Wszystko wiem jak zrobić, tylko co zrobić, żeby się nie powtarzały?
2.) Czy jest możliwe uniemożliwienie użytkownikowi otwarcia określonego pliku INI podczas pracy z programem? Zapisuję dane do tego INI linia po linii. Wiem, że zawartość można zakodować, ale może istnieje jakiś prostszy sposób niż to?

Z góry dzięki za sugeste/odpowiedzi/pomysły.

[Post edytowany dnia 13-04-2004 22:07 przez Viper87]


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


13-04-2004 22:06
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

1) Po poleceniu Randomize liczby będą losowe

2) W linii open dopisz Lock Read Write (lub tylko jedno z nich) np.

Open "C:\Plik" for Input Lock Read as #1


_____________________________________________
www.mob.abc.pl - moja strona o VB

13-04-2004 22:17
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

1.) Nie zrozumiałeś. Ja chcę, żeby program jak już wylosuje np. 2, to już dalej jej nie może wylosować, tylko losuje z określonego przedziału liczb, ale bez 2 itd, aż do wyczerpania wszystkich liczb i wtedy komunikat .
2.) Oto używane przeze mnie funkcje. Gdzie mam to dodać?

Dzięki za odpowiedź

Option Explicit
' Ścieżka do pliku INI
Public PlikINI As String

'Deklaracja funkcji do obsługi pliku INI
Private Declare Function GetPrivateProFileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal Appname As String, ByVal KeyName As Any, ByVal NewString As Any, ByVal Filename As String) As Integer

Public Sub SkasujDzial(ByVal Dzial As String)
  WritePrivateProfileString Dzial, 0&, "", PlikINI
End Sub

Public Sub ZapiszDoINI(Dzial As String, Klucz As String, Wartosc As String)
  WritePrivateProfileString Dzial, Klucz, Wartosc, PlikINI
End Sub

Public Function CzytajZINI(Dzial As String, Klucz As String) As String
Dim retval As Variant
Dim t As String * 500

  retval = GetPrivateProFileString(Dzial, Klucz, "", t, Len(t), PlikINI)

  If retval > 0 Then
      CzytajZINI = left$(t, retval)
  End If
 
End Function


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


13-04-2004 22:21
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Ad1) Jeżeli tak to zrób tak:

Dim a(1 To 10) As Boolean

Public Function Losuj() As Integer
Randomize
For i = 1 To 10
If a(i) = False Then GoTo a:
Next
Exit Function ' Bo już wszystkie były wylosowane
a:

x = Int(Rnd * 10 + 1)
If a(x) = True Then GoTo a:
a(x) = True

Losuj = x
End Function

i będą wylosowane nie pwtarzające się

ad2) Jestem po reinstalacji systemu i teraz nie mam api-guide ani api-viewera, więc nie podam przykładu. Możliwe że na początku można dodać funkcję open, ale jako api z odpowiednimi parametrami, nie będzie można odczytać pliku, ale może być że funkcje odczytu INI nie zadziałają

[Post edytowany dnia 13-04-2004 22:38 przez bisiek]


_____________________________________________
www.mob.abc.pl - moja strona o VB

13-04-2004 22:31
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Witaj!
Dzięki za rady. Jednak albo coś źle robię, albo Ty się gdzieś pomyliłeś. Napisałem w kodzie tak:

Dim a(1 To 10) As Boolean

Public Function Losuj() As Integer
Randomize
For i = 1 To 10
If a(i) = False Then GoTo a:
Next i
Exit Function ' Bo już wszystkie były wylosowane
a:
x = Int(Rnd * 10 + 1)
If a(x) = True Then GoTo a:
a(x) = True

Losuj = x
End Function


Private Sub Form_Load()
For u = 1 To 10
Form1.Losuj
MsgBox (Losuj)
Next u
End Sub

Z tego co wiem Twoja procedura powinna wylosować mi 10 niepowtarzających się liczb całkowitych, tymczasem przykładowy wynik jest taki: 8, 10, 5, 7, 6, 0, 0, 0, 0, 0 . Czyli defacto wylosował 5 liczb losowych, a pozostałe 5 to zera. Czy coś zrobiłem źle, czy Ty gdzieś masz błąd?


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


14-04-2004 14:24
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Funckja działa-jest tylko jeden szkopuł-ja potrzebuję generować liczby całkowite...
Po drugie, to nawet jak już się z tym bym uprał (zmienne integer zamiast double), to TWOJE LICZBY SIĘ POWTARZAJĄ...

[Post edytowany dnia 14-04-2004 15:12 przez Viper87]


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


14-04-2004 15:10
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Jeżeli ty wywołujesz funkcję losuj, a potem msgbox losuj to są to dwie funkcje. Usuń pierwszą to zadziała dobrze

[Post edytowany dnia 14-04-2004 15:21 przez bisiek]


_____________________________________________
www.mob.abc.pl - moja strona o VB

14-04-2004 15:11
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Dzięki-teraz działa. Nie wiem co mnie zaćmiło...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


14-04-2004 15:21
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Acha! Jeszcze jedno pytanie. Mianowicie, co mam zrobić, jeśli w trakcie działania programu będę chciał, żeby funkcja zadziałała od zera=zapomniała o tych wylosowanych liczbach???


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


14-04-2004 15:33
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Bisiek sorry, ze Cie tak dręczę, ale ta funkcja będzie dla mnie bezużyteczna, jeśli nie przerobisz jej tak, żeby jako arumenty mógł podać dolny i górny próg...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


14-04-2004 15:44
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Dim a(0 To 10000) As Boolean

Public Function Losuj(min As Long, max As Long) As Integer
Randomize
For i = min To max
If a(i) = False Then GoTo a:
Next i
Losuj = -1
Exit Function ' Bo już wszystkie były wylosowane
a:
DoEvents
x = Int(Rnd * (max - min + 1) + min)
If a(x) = True Then GoTo a:
a(x) = True

Losuj = x
End Function

Public Function Zeruj(Optional min As Long = 0, Optional max As Long = 10000) As Integer
For i = min To max
a(i) = False
Next i
End Function

Możesz kasować i zmieniać zakres


_____________________________________________
www.mob.abc.pl - moja strona o VB

14-04-2004 18:12
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
Wszystkich odpowiedzi: 10 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1