• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

SchattenMann

Funçao para Gerar numeros alternativos mas viciada (com probabilidades)

24 mensagens neste tópico

boas ppl...

pois bem o meu pedido pode parecer complexo ou ate estranho mas é bastante simples ate...

pois bem acho q o melhor e mesmo um exemplo e aqui vai:

tnh 3 tarefas: A, B e C

3 funcionarios: Zé, Manuel e Maria com diferentes "niveis de acesso" , ou seja, determinados funcionarios podem fazer tarefas q outros nao...em tabela temos:

                        A              B              C

01    Ze            1              1              0

02    Manuel      0              1              1                (todos percebem os 0s e os 1s)

03    Maria        0              0              1

o que eu quero é uma funçao (que eu acredito mesmo que haja) que aleatoriamente lançe um numero (neste caso 01.02 ou 03) com base nestas condiçoes. a parte da verificaçao do acesso é facil, com IF ou CASE está resolvido facilmente. o que eu nao sei e mesmo como programar para atribuir um numero aleatorio e (importante) que nao se repita na mesma "saida" (tipo atribuir a tarefa A e C ao mesmo funcionario)

eu penso que seja bastante simples para quem sabe a funçao...agora complica porque quero implementar mais uma condiçao...

digamos que vou atribuir uma nota - que servira como probabilidade - a cada funcionario conforme desempenho ou eficiencia...exemplificando:

devido a extrema confiança que tenho no Zé dou lhe nota 10 (P = 10/10). já o Manuel como é estagiario e tal tem nota 7 (P=7/10)

tenho uma tarefa do tipo B para atribuir logo os candidatos sao o Zé e o Manuel. dadas as P, provavelmente quem sera escolhido será o Zé....

no final o efeito sera que, em 17 tarefas B, 10 serao atribuidas ao Zé e apenas 7 ao Manuel....

penso que todos perceberam o que quero...teoricamente acho que seja simples...quero algo do tipo totoloto mas que de para atribuir as probabilidades a cada numero (que serve como cod de funcionario)

agradeço a aajuda

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não trabalho em VB, mas penso que terá um função de probabilidades como as outras linguagens.

Agora, o que queres é um probabilidade com pesos.

1º Tens de saber qual é o range que a função de probabilidades te dá. Se for de [0,1] numeros reais.

2º divides o range em % . Exemplo 20,30, 50. Verificas onde é que o valor da função cai. [0,0.2] (0.2,0.5] (0.5,1] 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não trabalho em VB, mas penso que terá um função de probabilidades como as outras linguagens.

Agora, o que queres é um probabilidade com pesos.

1º Tens de saber qual é o range que a função de probabilidades te dá. Se for de [0,1] numeros reais.

2º divides o range em % . Exemplo 20,30, 50. Verificas onde é que o valor da função cai. [0,0.2] (0.2,0.5] (0.5,1] 

quanto ha perte de existir uma funçao com probabilidades e exactamente o que quero descobrir...

quanto ao resto pa ser franco nao percebi completamente onde querias explicar...criaste grupos com as prob...ok...e depois?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não trabalho em VB, mas penso que terá um função de probabilidades como as outras linguagens.

Agora, o que queres é um probabilidade com pesos.

1º Tens de saber qual é o range que a função de probabilidades te dá. Se for de [0,1] numeros reais.

2º divides o range em % . Exemplo 20,30, 50. Verificas onde é que o valor da função cai. [0,0.2] (0.2,0.5] (0.5,1] 

quanto ha perte de existir uma funçao com probabilidades e exactamente o que quero descobrir...

quanto ao resto pa ser franco nao percebi completamente onde querias explicar...criaste grupos com as prob...ok...e depois?

cumps

E depois!!! Só precisas de ter uma distribução de probabilidade uniforme, o resto é só aplicar matemática.

Qual é a dificuldade de achar uma função de Probabilidade para VB? GOOGLE "VB random function"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não trabalho em VB, mas penso que terá um função de probabilidades como as outras linguagens.

Agora, o que queres é um probabilidade com pesos.

1º Tens de saber qual é o range que a função de probabilidades te dá. Se for de [0,1] numeros reais.

2º divides o range em % . Exemplo 20,30, 50. Verificas onde é que o valor da função cai. [0,0.2] (0.2,0.5] (0.5,1] 

quanto ha perte de existir uma funçao com probabilidades e exactamente o que quero descobrir...

quanto ao resto pa ser franco nao percebi completamente onde querias explicar...criaste grupos com as prob...ok...e depois?

cumps

E depois!!! Só precisas de ter uma distribução de probabilidade uniforme, o resto é só aplicar matemática.

Qual é a dificuldade de achar uma função de Probabilidade para VB? GOOGLE "VB random function"

m8 eu tou a pedir ajuda...nao sarcasmo...

nao percebi a tua explicaçao...se quiseres repetir agradeço....caso contrario sarcasmo nao e bem vindo

tnx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

m8 eu tou a pedir ajuda...nao sarcasmo...

nao percebi a tua explicaçao...se quiseres repetir agradeço....caso contrario sarcasmo nao e bem vindo

tnx

Acho que o que ele queria dizer é que depois geras números e vês em que intervalo caiu o número e tens o teu acontecimento.

Seguindo o exemplo anterior...

P (acontecimento1) = 20%

P (acontecimento2) = 30%

P (acontecimento3) = 50%

Então se há 3 acontecimentos possíveis, criam-se 3 grupos [0-19], [20-49], [50-99]. Depois gera-se um número entre 0 e 99, vê-se em que intervalo se encontra e pronto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

m8 eu tou a pedir ajuda...nao sarcasmo...

nao percebi a tua explicaçao...se quiseres repetir agradeço....caso contrario sarcasmo nao e bem vindo

tnx

Acho que o que ele queria dizer é que depois geras números e vês em que intervalo caiu o número e tens o teu acontecimento.

Seguindo o exemplo anterior...

P (acontecimento1) = 20%

P (acontecimento2) = 30%

P (acontecimento3) = 50%

Então se há 3 acontecimentos possíveis, criam-se 3 grupos [0-19], [20-49], [50-99]. Depois gera-se um número entre 0 e 99, vê-se em que intervalo se encontra e pronto.

mas eu nao quero probabilidades para o acontecimento...quero probabilidades para o funcionario!

se quiserem esqueçam o contexto...eu quero algo como a roleta russa mas viciada...ou seja em x de todos os num terem a mesma hipotesse eu dou a propabilidade de cada...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

imaginemos então uma roleta russa com 3 resultados possíveis (só pa ser mais fácil ;) )


Dim RandomNum as New Random
Dim num as Integer

num = RandomNum.Next(1,100)

Select Case num

Case 1 to 50 '50% probabilidade
*acção p/ 1º resultado*
Case 51 to 70 '20% probabilidade
*acção p/ 2º resultado*
Case 71 to 100 '30% probabilidade
*acção p/ 3º resultado*

End Select

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

imaginemos então uma roleta russa com 3 resultados possíveis (só pa ser mais fácil ;) )


Dim RandomNum as New Random
Dim num as Integer

num = RandomNum.Next(1,100)

Select Case num

Case 1 to 50 '50% probabilidade
*acção p/ 1º resultado*
Case 51 to 70 '20% probabilidade
*acção p/ 2º resultado*
Case 71 to 100 '30% probabilidade
*acção p/ 3º resultado*

End Select

Ora... exactamente... cada valor da roleta russa é um acontecimento... não tem nada que saber.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

imaginemos então uma roleta russa com 3 resultados possíveis (só pa ser mais fácil ;) )


Dim RandomNum as New Random
Dim num as Integer

num = RandomNum.Next(1,100)

Select Case num

Case 1 to 50 '50% probabilidade
*acção p/ 1º resultado*
Case 51 to 70 '20% probabilidade
*acção p/ 2º resultado*
Case 71 to 100 '30% probabilidade
*acção p/ 3º resultado*

End Select

ora pois bem se percebi correcto isso vai criar um numero random entre 1 a 100

depois temos 50% P de calhar na accção 1, 20 % na acção 2 e 30% na acção 3....

o randomnum 1,100 seria o cod do funcionario....

e isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é bem isso mas é parecido.

É mais se o randomnum 1,100 for entre 1 e 50 é o funcionário 01; se for entre 21 e 70 é o funcionário 02, se for entre 71 e 100 é o funcionário 03.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é bem isso mas é parecido.

É mais se o randomnum 1,100 for entre 1 e 50 é o funcionário 01; se for entre 21 e 70 é o funcionário 02, se for entre 71 e 100 é o funcionário 03.

NICE!

nao tinha pensado assim...eq nao estava mm a perceber o vosso raciocinio....

realmente assim ate nao nada mau pensado...

sera q a funçao funciona tipo:

num = RandomNum.Next(1,txt1.text)    ou    Case 1 to lbl1.caption....?

eu o q estava a pensar agora seria criar uma tabela onde simularia as probabilidades...exemplo:

01 Zé        75%

02 Manuel 25%

logo faria uma tabela parecida com isto

cod  sum

01      1

01      1

01      1

02      1

de seguida faria algo que em portugues seria:

somar os campos "sum" o que daria o total de linhas da tabela

depois  faria rnd(1,soma) o que daria um num random que seria algures a linha escolhida...

o q acham? sera viavel...?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

entao so uma cena....eu tou a usar access e uso a ligaçao ADODC...mas nunca usei um comando para me posicionar num sitio especifico...nunca precisei de algo assim

p exemplo se quisesse neste pedaço de codigo escolher a posiçao...50....como o faria?

[code]Private Sub ListClientes_Click()
    frmSuporte.Adodc1.Recordset.MoveFirst
    login_counter = 0
    Do While Not frmSuporte.Adodc1.Recordset.EOF
        If frmSuporte.Adodc1.Recordset.EOF = "False" Then
            If ListClientes.Text = frmSuporte.txtNomeCliente.Text Then
                lblCod_cliente.Caption = frmSuporte.txtCod_cliente.Text
            End If
        End If
        frmSuporte.Adodc1.Recordset.MoveNext
    Loop

[/code]

frmSuporte.Adodc1.Recordset.Move(50)....?  :hmm:

e qnt a esta parte?

sera q a funçao funciona tipo:

num = RandomNum.Next(1,txt1.text)    ou    Case 1 to lbl1.caption....?

é possivel?

ou tenho que criar uma variavel atraves da caption/text?

tipo x = txt1.text

num = RandomNum.Next(1,X)

tnx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

quanto à tua primeira dúvida, não te sei realmente ajudar. Quanto à 2ª, para fazeres desse modo tens que fazer tipo:

RandomNum.Next(1, Cint(TextBox.Text)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

quanto à tua primeira dúvida, não te sei realmente ajudar. Quanto à 2ª, para fazeres desse modo tens que fazer tipo:

RandomNum.Next(1, Cint(TextBox.Text)

ok bgd so falta agora a outra parte...

alguem q saiba pff?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dim RandomNum as New Random

compile error...

:S

qual e o problema??? :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vb 6 ou 2005?

pode parecer um bocado mau mas...agora fiquei indeciso...

suponho ser 2005 mas como nao tou no meu PC nao afirmo nada ainda...

mas fui tentando e consegui o seguinte codigo que funciona...+/-

[code]Private Sub Command1_Click()
Dim cont As Integer
Dim max, min
max = 45
min = 1
Dim num As Integer
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer 
Dim g As Integer
Dim h As Integer
Dim i As Integer

a = 0
b = 0
c = 0
d = 0
e = 0
f = 0
g = 0
h = 0
i = 0



For cont = 0 To 10000
num = Int((max - min + 1) * Rnd + min)
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Move (num)

If Label11.Caption = 1 Then 'verifica se o campo act. é = 1

Select Case Label10.Caption 'label com o valor actual de cod

Case 0
    cont = cont + 1
Case 1
    a = a + 1
Case 2
    b = b + 1
Case 3
    c = c + 1
Case 4
    d = d + 1
Case 5
    e = e + 1
Case 6
    f = f + 1
Case 7
    g = g + 1
Case 8
    h = h + 1
Case 9
    i = i + 1
    
End Select

Label11.Caption = 0
Adodc1.Recordset.Update

'aqui tem de estar o erro mas nao percebo o pq...

Label1.Caption = a
Label2.Caption = b
Label3.Caption = c
Label4.Caption = d
Label5.Caption = e
Label6.Caption = f
Label7.Caption = g
Label8.Caption = h
Label9.Caption = i

ElseIf Label11.Caption = 0 Then

cont = cont + 1

End If

Next cont

End Sub

[/code]

porem tenho um problema que gostava que o identificassem...se possivel

criei o apenas para verificar as probabilidades...tenho apenas uma tabela com este aspecto:

cod    act.

1        1

2        1

2        1

3        1

3        1

3        1

etc ate 9...(para ser mais simples o cod do funcionario esta a corresponder a sua probabilidade de sair)

como podem ver ele faz varios lançamentos e depois cada label mostrara o num de vezes que cada cod saiu...funciona perfeitamente mas queria que funcionasse sem reposiçao...arranjos simples matematicamente falando

para isso criei o campo act.: por default 1 e quando e usado passa a 0 pelo q na proxima saida esse nao ira contar...

o problema e o passar de 1 para 0...nao esta a funcionar...em vez de passar apenas uma linha passa todos...e nao estou a perceber Oo

alguma ideia?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ninguem que queira responder...????

:( :down: :hmm: :bored: :shocking: :nono1:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora