2
votes

Comment définir des nombres aléatoires compris dans une plage de kdb +?

Dans Kdb +, comment utiliser la fonction "roll" pour que les nombres aléatoires générés tombent dans une plage qui ne commence pas par 0? Par exemple, que faire si je voulais que la plage soit comprise entre 2 et 10 au lieu de 0 à 10?

Que dois-je ajouter au code pour le faire tomber dans une plage au lieu de la valeur par défaut 0-x? J'ai essayé et cherché toutes les méthodes mais je n'arrive pas à en trouver une.

kdb

0 commentaires

4 Réponses :


0
votes
// quick and simple method
q)10?2+til 8
6 2 4 3 4 3 4 5 4 7
// or function (x)=num to be dealt, (y) start range, (z) end range
q)f:{x?y+til 1+z-y}
q)f[10;10;20]
12 17 10 11 19 12 11 18 18 11

1 commentaires

Veuillez ajouter une explication à ce code, pas un lien vers une documentation externe



0
votes

Si vous fournissez une liste dans l'argument de droite, vous obtiendrez une valeur aléatoire à partir de cette liste. Pour obtenir une plage aléatoire de 2 à 10, vous pouvez utiliser til pour générer la plage:

q)3?(`abc;2 3f;10;20;30;"text")
2 3f
`abc
"text"

Vous pouvez même fournir une liste générale à partir de laquelle tirer au hasard:

q)2+til 9
2 3 4 5 6 7 8 9 10
q)1?2+til 9
,6


2 commentaires

Je vous remercie. Je pensais que c'était ça mais j'ai continué à mettre 2 jusqu'à 10. Je ne savais pas que tu avais besoin du signe plus.


Notez que pour les grandes plages, cela créera une grande liste qui prendra à la fois de la mémoire et du temps.



-1
votes

La fonction mathématique simple pour le générateur de nombres aléatoires est:

(rand () mod (1 + max- min)) + min

q) f:{x+(z?0) mod  1+y-x}
q) f[2;10;4]
q) 6 4 7 2 

Mise à jour: Je n'ai pas remarqué que vous vouliez générer deux nombres aléatoires dans la plage. Vous pouvez facilement modifier la fonction ci-dessus pour cela:

q) f:{x+rand[0] mod  1+y-x}
q) f[5;10]
q) 7


1 commentaires

Quiconque a donné le vote défavorable, il est toujours bon de laisser la raison de cela dans un commentaire car cela aiderait tout le monde à comprendre le problème.



5
votes

Vous pouvez aussi simplement rouler de 0 à 8 puis en ajouter deux. Cela ne nécessite pas qu'une liste soit pré-générée

q)2+5?9
10 2 7 10 7

En supposant que vous vouliez 2-10 inclus


0 commentaires