2012-06-06 4 views
1

Je travaille sur un jeu de mot iOS qui est construit à partir d'une base de données SQLite autour de tirer des mots au hasard.SQLite pour iOS - random() pas assez bon

J'ai donc 1 table, mots, je sors X mots au hasard comme ceci:

SELECT Word FROM (SELECT Word FROM Words ORDER BY RANDOM() LIMIT @limit) ORDER BY LENGTH(Word) 

Le problème est que mes utilisateurs bêta se sont plaints il ne suffit pas au hasard. Il semble tirer les mêmes mots beaucoup de temps et quelques mots jamais du tout.

Y at-il une alternative à ce que je fais? Je sais que RANDOM() de SQLite n'est probablement pas le meilleur. Je ne veux pas charger tous les mots en mémoire, car il y en a plus de 3 000.

PS - mon application est construite en C# avec MonoTouch, mais je peux prendre des réponses Objective-C (ou même pseudocode) pour que

+0

3K mots de 20 octets chacun prend moins de 60 kilo-octets. C'est littéralement rien pour iOS. A titre de comparaison, une image 256x256 de certains lolcat consomme 256K de mémoire. En fait, SQLite dispose d'un cache mémoire (avec une taille maximale par défaut d'environ 2 Mo) qui a probablement tous été chargés dans la mémoire de toute façon. – hamstergene

+0

Je vais essayer de les charger en mémoire. Nous soutenons également Android avec cette application, donc je me demande si les anciens téléphones droïdes peuvent ne pas avoir la mémoire pour cela. Nous soutenons 2.2 et plus haut. – jonathanpeppers

Répondre

2

Peut-être parce que vous les commandez? Vous sélectionnez une liste de mots triés au hasard, puis vous faites une autre sélection et ordonnez ce résultat par la longueur du mot. Ce deuxième ordre pourrait gâcher votre randomisation. Je diviserais cela et en fonction des mots dont vous avez besoin dans le jeu faites la longueur d'une clause where, ou sélectionnez d'abord la longueur et randomiser ces listes?

+0

Je vais essayer et faire la commande en longueur C#. – jonathanpeppers

+0

Je pense que cela l'a corrigé. Je ne suis pas sûr de savoir comment un select imbriqué le briserait. – jonathanpeppers