diff --git a/charge/charge.c b/charge/charge.c
index d76e4544be707d158f1298b072e91adb79def1b4..42e91b6290dcac17b238589c63f75aa87a3087d7 100644
--- a/charge/charge.c
+++ b/charge/charge.c
@@ -69,4 +69,8 @@ bool compute_p_next(charge_t *charges, int num_charges, double eps,
 charge_t charge_create(double q, vec2 pos) {
     charge_t c = {.q = q, .pos = pos};
     return c;
+}
+
+double random_charge_q(bool positive) {
+    return rand_one() * (positive ? 1 : -1);
 }
\ No newline at end of file
diff --git a/charge/charge.h b/charge/charge.h
index ba6a607521d77114e09db0bf02c43374feee4fec..1f8343717814a685a99dd785be0f2424e8119a63 100644
--- a/charge/charge.h
+++ b/charge/charge.h
@@ -109,4 +109,12 @@ bool compute_p_next(charge_t *charges, int num_charges, double eps,
  */
 charge_t charge_create(double q, vec2 pos);
 
+/**
+ * @brief Return a random charge q
+ *
+ * @param positive
+ * @return double
+ */
+double random_charge_q(bool positive);
+
 #endif
\ No newline at end of file
diff --git a/main.c b/main.c
index 415e5897089f6476c00b2aee4fd455d808430e53..9373cabd5d90026968c6020f9731188b3fd3ea92 100644
--- a/main.c
+++ b/main.c
@@ -84,13 +84,18 @@ void handle_mouse_input(int button, int state, int x, int y) {
     if (state == GLUT_UP)
         return;
 
-    if (button == GLUT_LEFT_BUTTON) {
+    if (button == GLUT_LEFT_BUTTON || button == GLUT_RIGHT_BUTTON) {
         charge_count += 1;
         default_charges_pos[charge_count - 1] =
             vec2_create((double)x / WINDOW_WIDTH, (double)y / WINDOW_HEIGHT);
-        default_charges[charge_count - 1] = rand_one() / (rand_one() * 10 - 5);
     }
 
+    if (button == GLUT_LEFT_BUTTON)
+        default_charges[charge_count - 1] = random_charge_q(true);
+
+    if (button == GLUT_RIGHT_BUTTON)
+        default_charges[charge_count - 1] = random_charge_q(false);
+
     glutPostRedisplay();
 }
 
@@ -106,7 +111,7 @@ int main(int argc, char **argv) {
 
     // Generate all default charges
     for (int i = 0; i < charge_count; i++) {
-        default_charges[i] = rand_one() / (rand_one() * 10 - 5);
+        default_charges[i] = random_charge_q((bool)(rand() % 2 == 0));
         default_charges_pos[i] = vec2_create(rand_one(), rand_one());
     }