diff --git a/src/data/database b/src/data/database index 61d2fae..4be6a87 100644 Binary files a/src/data/database and b/src/data/database differ diff --git a/src/getNewPrompt.mjs b/src/getNewPrompt.mjs new file mode 100644 index 0000000..32f308d --- /dev/null +++ b/src/getNewPrompt.mjs @@ -0,0 +1,41 @@ +import { db } from "./db.mjs" +import { randomSkewNormal, randomSkewNormalTrimmed } from "./skewNormal.mjs" + +const maxCount = 30000000 +const minCount = 200000 + +export default async function getNewPrompt() { + const badWords = await db('bad_words') + .select('word') + + const prompts = await db('dictionary') + .select('*') + .where({ + derivative: 0, + scientific: 0, + }) + .andWhere('count', '<', maxCount) + .andWhere('count', '>', minCount) + .andWhere('word', 'not in', badWords) + .whereNotNull('pronunciation') + .orderBy('count') + + + const randomEntry = (array) => { + //const random = (randomSkewNormal(Math.random,0,2,0)/6) + const random = Math.random() + return array[ + parseInt( + array.length * random + ) + ] + } + db.destroy() + return randomEntry(prompts) +} + + + +console.log(await getNewPrompt()) + + diff --git a/src/skewNormal.mjs b/src/skewNormal.mjs new file mode 100644 index 0000000..6b23acb --- /dev/null +++ b/src/skewNormal.mjs @@ -0,0 +1,29 @@ +const randomNormals = (rng) => { + let u1 = 0, u2 = 0; + //Convert [0,1) to (0,1) + while (u1 === 0) u1 = rng(); + while (u2 === 0) u2 = rng(); + const R = Math.sqrt(-2.0 * Math.log(u1)); + const Θ = 2.0 * Math.PI * u2; + return [R * Math.cos(Θ), R * Math.sin(Θ)]; +} + +export const randomSkewNormal = (rng, ξ, ω, α = 0) => { + const [u0, v] = randomNormals(rng); + if (α === 0) { + return ξ + ω * u0; + } + const 𝛿 = α / Math.sqrt(1 + α * α); + const u1 = 𝛿 * u0 + Math.sqrt(1 - 𝛿 * 𝛿) * v; + const z = u0 >= 0 ? u1 : -u1; + return ξ + ω * z; +} + +export const randomSkewNormalTrimmed = ()=>{ + let random = 1 + do { + random = randomSkewNormal(Math.random,0,2,0) + } while (random<0 || random>0.999999) + return random +} +