Discussione:
Numeri casuali diversi tra loro
(troppo vecchio per rispondere)
Lele
2009-07-29 10:50:01 UTC
Permalink
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
r
2009-07-29 12:11:02 UTC
Permalink
Post by Lele
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
http://groups.google.com/group/microsoft.public.it.office.excel/browse_thread/thread/b945adc182fe07bf

in particolare l'intervento di ivano
http://groups.google.com/group/microsoft.public.it.office.excel/msg/cbe853733bb724e1

saluti
r
--
Come e dove incollare il codice:
http://www.rondebruin.nl/code.htm

Il mio ultimo lavoro ..
http://excelvba.altervista.org/blog/index.php/Excel-VBA/UsedRange-eccezioni-e-alternative.html
Bruno Campanini
2009-07-29 15:26:19 UTC
Permalink
Post by Lele
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
Ad libitum:
------------------------------------------------------------
Public Function fRandom3() As String
Dim RndColl As New Collection, Num As Integer, i

Do Until RndColl.Count = 3
Num = Int(10 * Rnd + 1)
On Error Resume Next
RndColl.Add Num, CStr(Num)
On Error GoTo 0
Loop

For Each i In RndColl
fRandom3 = fRandom3 & i & ","
Next

End Function
-------------------------------------------------------------


--------------------------------------------------------------
Public Sub Random3()
Dim RndColl As New Collection, Num As Integer, i

Do Until RndColl.Count = 3
Num = Int(10 * Rnd + 1)
On Error Resume Next
RndColl.Add Num, CStr(Num)
On Error GoTo 0
Loop

For Each i In RndColl
MsgBox i
Next

End Sub
--------------------------------------------------------------

Bruno
r
2009-07-29 22:50:01 UTC
Permalink
Post by Bruno Campanini
Post by Lele
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
------------------------------------------------------------
Public Function fRandom3() As String
Dim RndColl As New Collection, Num As Integer, i
Do Until RndColl.Count = 3
Num = Int(10 * Rnd + 1)
On Error Resume Next
RndColl.Add Num, CStr(Num)
On Error GoTo 0
Loop
For Each i In RndColl
fRandom3 = fRandom3 & i & ","
Next
End Function
-------------------------------------------------------------
--------------------------------------------------------------
Public Sub Random3()
Dim RndColl As New Collection, Num As Integer, i
Do Until RndColl.Count = 3
Num = Int(10 * Rnd + 1)
On Error Resume Next
RndColl.Add Num, CStr(Num)
On Error GoTo 0
Loop
For Each i In RndColl
MsgBox i
Next
End Sub
--------------------------------------------------------------
ciao Orso Bruno :-)
che piacere rivederti!

in alternativa alla tua soluzione ...
so che non ami le ricorsive ... ma spero
appezzerai comunque
Sub test()
Dim i As Long
Dim l As Long

i = Rnd1
l = Rnd2(i)
Debug.Print i & " " & l & " " & Rnd3(i, l)

'oppure
i = Rnd1
l = Rnd1
Debug.Print i & " " & l & " " & Rnd3(i, l)

End Sub


Function Rnd1() As String
'restituisce un numero rnd tra 1 e 10
Rnd1 = Int(10 * Rnd + 1)
End Function


Function Rnd2(l As Long) As String
'restituisce un rnd da 1 a 10 diverso da l
Dim i As Long
i = Int(10 * Rnd + 1)
If i = l Then
Rnd2 = Rnd2(i)
Else
Rnd2 = i
End If
End Function

Function Rnd3(ByRef l As Long, ByRef c As Long) As String
'restituisce un numero rnd tra 1 e 10 diverso da l e c
'se l=c viene mantenuto l, ricalcolato c e restituito un
'rnd diverso da l e c

Dim i As Long
If l = c Then
c = Rnd1
Rnd3 = Rnd3(l, c)
Else
i = Rnd1
If i = l Or i = c Then
Rnd3 = Rnd3(l, c)
Else
Rnd3 = i
End If
End If
End Function

saluti
r
--
Come e dove incollare il codice:
http://www.rondebruin.nl/code.htm

Il mio ultimo lavoro ...
http://excelvba.altervista.org/blog/index.php/Excel-VBA/UsedRange-eccezioni-e-alternative.html
Roberto
2009-07-30 21:24:35 UTC
Permalink
Post by Lele
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
io ne suggerisco una facile facile (era di Fernando?):

- in a1:a10 numeri da uno a 10
- in b1:b10 la formula =CASUALE()

poi DATI>ORDINA> ordina per colonna B.

In questo modo le celle A1:A3 (o altre a tua scelta) ti danno quello
che chiedi.
Roberto
r
2009-07-30 23:22:01 UTC
Permalink
Post by Roberto
Post by Lele
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
- in a1:a10 numeri da uno a 10
- in b1:b10 la formula =CASUALE()
poi DATI>ORDINA> ordina per colonna B.
In questo modo le celle A1:A3 (o altre a tua scelta) ti danno quello
che chiedi.
Roberto
mi fai venire in mente una cosa:
Sub test()
Dim i As Long
For i = 1 To 10
Debug.Print Rnd_10(i)
Next
End Sub

Function Rnd_10(n As Long) As String
'n da 1 a 10
'restituisce n numeri rnd compresi
'tra 0 e 9 univoci
Dim s As String
Dim i As Long, t As String
s = "0123456789"
For i = Len(s) To Len(s) - n + 1 Step -1
t = Mid(s, Int(i * Rnd + 1), 1)
s = Replace(s, t, "")
Rnd_10 = Rnd_10 & t & ";"
Next
Rnd_10 = Left(Rnd_10, n + n - 1)
End Function

saluti
r
--
Come e dove incollare il codice:
http://www.rondebruin.nl/code.htm

Il mio ultimo lavoro ..
http://excelvba.altervista.org/blog/index.php/Excel-VBA/UsedRange-eccezioni-e-alternative.html
Roberto
2009-08-02 21:25:27 UTC
Permalink
Post by Roberto
- in a1:a10 numeri da uno a 10
- in b1:b10 la formula =CASUALE()
poi DATI>ORDINA> ordina per colonna B.
In questo modo le celle A1:A3 (o altre a tua scelta) ti danno quello
che chiedi.
Mi ero dimenticato di questa più snella:

in A1:A10: =CASUALE()
in B1:B3 =RANGO(A1:A10;A1:A10) 'da immettere come formula matriciale

Roberto
eliano
2009-08-02 23:52:01 UTC
Permalink
Post by Roberto
Post by Roberto
- in a1:a10 numeri da uno a 10
- in b1:b10 la formula =CASUALE()
poi DATI>ORDINA> ordina per colonna B.
In questo modo le celle A1:A3 (o altre a tua scelta) ti danno quello
che chiedi.
in A1:A10: =CASUALE()
in B1:B3 =RANGO(A1:A10;A1:A10) 'da immettere come formula matriciale
Sicuro ?
Roberto
2009-08-03 21:23:10 UTC
Permalink
Post by eliano
Sicuro ?
Oh yes!
Ciao
Roberto
eliano
2009-08-03 23:33:01 UTC
Permalink
Post by Roberto
Post by eliano
Sicuro ?
Oh yes!
Ciao
Roberto
Forse sarebbe meglio:
in B1: =RANGO(A1;$A$1:$A$10)
non matriciale e copiare in basso in B2 e B3
Roberto
2009-08-07 21:42:02 UTC
Permalink
Post by eliano
in B1: =RANGO(A1;$A$1:$A$10)
non matriciale e copiare in basso in B2 e B3
beh, anche su venti o più righe entrambi i metodi danno risultati
identici...
Roberto
eliano
2009-08-07 23:35:01 UTC
Permalink
Post by Roberto
Post by eliano
in B1: =RANGO(A1;$A$1:$A$10)
non matriciale e copiare in basso in B2 e B3
beh, anche su venti o più righe entrambi i metodi danno risultati
identici...
Roberto
Non è che la cosa abbia molta importanza, ma prova:
A B C D
0,143802022 9 9 9
0,242207205 7 7 9
0,131148654 8 10 9
0,91595692 1 1 9
0,699942568 2 3 9
0,485145324 4 6 9
0,560731979 3 5 9
0,222343562 3 8 9
0,562138065 2 4 9
0,766445781 1 2 9

in A1:A10 =CASUALE()
in B1:B10 =RANGO(A1:A10;A1:A10) Matriciale
in C1:C10 =RANGO(A1;$A$1:$A$10) Non Matriciale
in D1:D10 =RANGO(A1:A10;A1:A10) fissa Matriciale

se scrivi in B1 la formula anche matriciale: =RANGO(a1:a10;a1:a10)
e la copi in basso vai fuori scala e puoi ottenere doppioni
se scrivi in TUTTE le celle da D1 a D10 la stessa formula
ottieni un solo numero, il primo nel rango

Eliano

eliano
2009-07-31 00:01:03 UTC
Permalink
Post by Lele
ciao a tutti!
io devo creare 3 numeri casuali da 1 a 10 senza la possibilità che questi
possano essere uguali.
la formala per i numeri casuali è =CASUALE()
mentre perchè siano tutti diversi come devo fare?
grazie mille!
Ciao Lele.
Io invece non ci ho ripensato (ciao Roby) e arrivo con la mia artigianale
che fa riferimento esplicito a formule XL di fernando, senza il problema del
ricalcolo e dell'ordinamento dei dati.
Apri un nuovo file .xls e copia in un modulo standard queste tre routines.

Option Explicit

Public Sub prova()
createst
scegli123
End Sub

Public Sub createst()
Range(Cells(1, 1), Cells(11, 3)).Value = ""
Cells(1, 1).Value = "Numeri"
Cells(1, 2).Value = "Casuale"
Cells(1, 3).Value = "Scelta"
End Sub

Public Sub scegli123()
Dim R As Long, C As Long, x As Long
Randomize
For x = 2 To 11
Cells(x, 1).Value = x - 1
Cells(x, 2).Value = Rnd()
Next
For x = 2 To 4
Cells(x, 3).Select
ActiveCell.FormulaR1C1 = _
"=RANK(RC[-1],R2C2:R11C2)+COUNTIF(R2C2:R[5]C[-1],RC[-1])-1"
'se non ti interessa la formula togli il commento
' all'istruzione che segue:
'ActiveCell.Value = ActiveCell.Value
Next
End Sub

Torna ad excel e lancia la macro: prova
In seguito rilancia più volte la macro: scegli123

Saluti
Eliano
Loading...