Home > database >  Create a new array from a random() generator?
Create a new array from a random() generator?

Time:10-21

I'm trying to create a new array with 5 random names taken from an array with 897 names. This is what I tried to do but I'm not sure how to specify that I only want 5 names:

for(let i = 0; i < pokemon.all().length; i  ){
    pokedex = [i];
};
app.get('/dex', (req, res) => {
    res.send(pokedex)
});

CodePudding user response:

function pickNOf(list, n) {
  // - create a new shallow array copy.
  // - does decouple the original reference, thus it
  //   prevents its further mutation by e.g. `splice`.
  list = Array.from(list);

  return Array
    // - creates an iterable array of the desired length ...
    .from({ length: n })
    // ... thus it can be iterated by e.g. `map` or `flatMap`.
    .flatMap(() =>
      // - `splice` does mutate the list by removing a
      //   single item from its randomly chosen index.
      list.splice(Math.floor(Math.random() * list.length), 1)
    );
}
const listOfAllPokemonNames = [
  "Bulbasaur", "Ivysaur", "Venusaur", "Charmander", "Charmeleon",
  "Charizard", "Squirtle", "Wartortle", "Blastoise", "Caterpie",
  "Metapod", "Butterfree", "Weedle", "Kakuna", "Beedrill", "Pidgey"
];

console.log(
  "pickNOf(listOfAllPokemonNames, 5) ...",
  pickNOf(listOfAllPokemonNames, 5)
);
console.log(
  "pickNOf(listOfAllPokemonNames, 9) ...",
  pickNOf(listOfAllPokemonNames, 9)
);
console.log(
  "pickNOf(listOfAllPokemonNames, 3) ...",
  pickNOf(listOfAllPokemonNames, 3)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

Usage within the OP's code then does look like this ...

function pickNOf(list, n) {
  list = Array.from(list);
  return Array
    .from({ length: n })
    .flatMap(() =>
      list.splice(Math.floor(Math.random() * list.length), 1)
    );
}

app.get('/dex', (req, res) => {
  res.send(pickNOf(pokemon.all(), 5))
});

CodePudding user response:

Take a look at this, use Math.random() to generate random index and get it from pokemons array, then unset the value from pokemons to have no doublon in pokedex.

let pokemons = ['pika1','pika2','pika3','pika4','pika5','pika6','pika7']
let pokedex = [];
for (i = 0; i < 5; i  ) {
  id = Math.floor(Math.random() * pokemons.length);
  pokedex.push(pokemons[id]);
  pokemons.slice(i,1)
}
//app.send() here...
console.log(pokedex)
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

EDIT: Considering you have a pokemon.random() generator(?) in this npm package. Simply use:

let pokedex = [];
for(let i = 0; i < 5; i  )    
    pokedex.push(pokemon.random());
app.get('/dex', (req, res) => {     
        res.send(pokedex) 
});

EDIT N°2: Using Objects

let pokedex = [];
for (i = 0; i < 5; i  ) {
  let pokemon = {
  name:pokemon.random(),
  attack:Math.floor(Math.random() * (100 - 50   1)  50),
  defense:Math.floor(Math.random() * (100 - 50   1)  50)
  };
  pokedex.push(pokemon);
}

function attack(attacker,defenser)
{
  defenser.defense -= attacker.attack
  return attacker && defenser;
}

function fakeMatch(attacker,defenser)
{
  attack(attacker,defenser)
}
console.log(pokedex)
fakeMatch(pokedex[0],pokedex[3])
console.log('RESULT Pokedex 0 attacked Pokedex 3')
console.log(pokedex)

EDIT N°3: Object with function (proper way)

let pokemons = ['pika1', 'pika2', 'pika3', 'pika4', 'pika5', 'pika6', 'pika7']
let pokedex = [];
for (i = 0; i < 5; i  ) {
  let id = Math.floor(Math.random() * pokemons.length);
  let pkm = {
    name: pokemons[id],
    life: 100,
    strenght: Math.floor(Math.random() * (100 - 50   1)   50),
    defense: Math.floor(Math.random() * (100 - 50   1)   50),
    attack: function(target) {
      target.life -= this.strenght;
      console.log(this.name   ' attack '   target.name)
      console.log(target.name   ' loose '   this.strenght   ' of life')
      //Test if life > 0 or anything else with % defense etc...
      if (target.life <= 0) {
        console.log(target.name   ' is dead')
      }
    }
  };
  pokedex.push(pkm);
  pokemons.slice(id, 1)
}
pokedex[0].attack(pokedex[1]);
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

  • Related