Ir para conteúdo
Fórum Script Brasil
  • 0

Sortear 2 números Random em struct


Genilson Pereira

Pergunta

Bom pessoal, estou desenvolvendo um sistema PVP para um game e preciso sortear 2 números, esses números não podem se repetir e nem serem iguais, pois será a index dos duelistas.

Nesse código, o sistema sorteia os números mas os números se repetem.

EX: IndexA recebe o número 4 random e IndexB recebe o número 9 random , então esses números não podem aparecer na próxima execução do código e devem sempre ser diferentes um a o outro.

bool CPVP::GetFighters(PVP_DATA * lpInfo, int Count)
{
    int IndexA = rand()%Count;
    int IndexB = rand()%Count;

    lpInfo-> DuelistA = IndexA;
    lpInfo-> DuelistB = IndexB;

    if (Count < 2)
    {
       return false;
    }
    return true;
 }
Editado por Genilson Pereira
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Se me recordo pra isso vc teria que usar a srand em conjunto com a função time pra ele poder gerar números diferentes em cada execução, um exemplo simples:

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    srand(time(0)); //Passando time como o valor do seed

    for(int a = 1; a < 10; a++)
    {
        cout << 1 + (rand() % 10) << endl;
    }
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, porém mesmo com o srand ainda gera numeros repetitivos, e o que eu queria era gerar 2 números diferentes um do outro.. e os números que fossem gerado, não aparecesse mais. ja tentei salvar os números que são gerados, em array.. mas nao funciona como esperado.

EX: Sortear 2 números de 10 possiveis.. 9 e 8, 7 e 6, 5 e 4, 3 e 2, 1 e 0. queria mais ou menos deste modo.

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta assim:

bool CPVP::GetFighters(PVP_DATA * lpInfo, int Count)
{
    int IndexA = rand()%Count;
    int IndexB = (IndexA + rand()%(Count-1) + 1)%Count;

    lpInfo-> DuelistA = IndexA;
    lpInfo-> DuelistB = IndexB;

    if (Count < 2)
    {
       return false;
    }
    return true;
 }

 

Edit: Faltou somar +1 dentro do parênteses, agora deve funcionar corretamente, IndexA e IndexB sempre no intervalo mas nunca iguais.

Editado por isrnick
Link para o comentário
Compartilhar em outros sites

  • 0

Ex:

Count = 10 e IndexA = 5

rand()%(Count-1) = [0 a 8]
rand()%(Count-1) + 1 = [1 a 9]
IndexA + rand()%(Count-1) + 1 = [6 a 14]
(IndexA + rand()%(Count-1) + 1)%Count = [6 a 9] ou [0 a 4]

Logo, IndexB nunca será igual a 5, mas pode ser qualquer outro número de 0 a 9.

 

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado @isrnick

Bom, esse código que você postou funciona bem, porém está havendo repetição.

Ex: IndexA = 4 e IndexB = 7, foi sorteado de 0 a 10 (Tenho que conseguir uma maneira de salvar estes números para nao haver repetição na proxima vez).

No próximo sorteio irá sortear de 0 a 10, Exceto os números já usados: 4 e 7.

Editado por Genilson Pereira
Link para o comentário
Compartilhar em outros sites

  • 0

Então você poderia mudar a lógica...

Fora dessa função você cria um vetor com números indo de 0 a Count-1 em cada posição. Aí usa random_shuffle ( http://en.cppreference.com/w/cpp/algorithm/random_shuffle ) pra embaralhar o vetor.

Então nessa função você muda pra guardar os próximos 2 itens do vetor em sequência toda vez que ela for chamada, pra fazer isso tem várias maneiras possíveis, você poderia passar o vetor e a posição atual para a função, poderia passar direto os 2 próximos valores do vetor para a função, poderia fazer o vetor ser global e passar apenas posição atual, etc...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...