joey
Member
Only people in the same group, in the same competition though.
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
This is a good point actually, and is quite a concern. If you were to know (for example) the hour in which the scrambles were being generated then that would only be 3.6 million cubes to check. It would be quite feasible to go to a competition with a database of scramble sequences. As soon as you have the first scramble in the sequence, then all subsequent scrambles can be worked out. NOTE: This is also a problem for the current random-moves generators used officially.Given a certain scramble/cube state, would it be possible for anyone who reverse-engineers cube explorer, and the pseudo random number generator being used to predict the next scramble (using a computer)?
Yes. Especially now that we have the source code. The problem is that while Mersenne Twister is very good once it's running, the scrambler starts it with System.currentTimeMillis() as seed. There are thus only 86.4 million possibilities per day. Encoding a scramble state in 9 bytes and its corresponding seed in 5, I could store all first scrambles and their seeds for a whole month in a 34 GB file. So I could prepare that before a competition, look at the first scramble of a round, look up its seed in my file, and use it to generate the next four scrambles.
Am I supposed to be insulted by this? Because it's closer to "mystified".to coin a phrase for the enjoyment of Lord Gottlieb
This is ridiculous. There will be very few scrambles left after these tests, and those that ARE left will represent the most difficult (in some sense), not random ones. By generating random positions we are testing people on every type of scramble, not just ones that you think are difficult. Besides, these scrambles won't be equally difficult to every method like randomized ones will. I notice you include nothing about edge orientation, for instance, meaning ZZ solvers won't find these scrambles harder than normal. It is a fact that you cannot make scrambles hard for everyone.1) NO corner should already be correctly positioned (relative to the center pieces on odd NxNXN cubes).
2) Now using any corner as reference(ignoring centers), this corner, and only this corner, can be viewed as solved relative to all the other corners. [...]
3) Testing with all the corner pieces as the solved reference (ignoring centers), NO edge piece should be solved relative to the position of that corner. This will reject all cases that have prebuilt C/E pairs. Also testing so that NO edge piece is correctly placed relative to the position of the centers(i.e. no edge may already be solved). Optionally, edge pieces could also be tested relative to each other (ignoring centers) so that any 2 that could be correctly positioned with a single center slice move could also be rejected.
Do you mean this? Because there's no way that will generate a solution less than 20f for a scrambled position. I'll assume you mean CubeExplorer or something analogous. Anyway the range of 16f to 18f is arbitrary and silly. There is nothing wrong with a 15f* cube (it's not easier, generate a few), and there is nothing wrong with a 19f* cube (it's not harder, generate a few). Maybe the difference would matter if people solved cubes optimally (fewest moves?) but they don't and it doesn't. If you don't believe me that optimality means very little about solve difficulty, I can provide a 16f* cube whose optimal solution is a Fridrich solution.4) Using CubeX to test the solution length, and only keep those that can be solved within the range 15f>x>19f. The actual scramble should be generated with the same program.
It is always scrambled, just not always equally difficult. You seem to think it's better to make "real" scrambles, but did you think about how much people already know about the scrambles? If this policy were to be instituted, people would be aware that scrambles are setup in a specific way, and would modify their methods accordingly. People would practice these kinds of scrambles, get used to very slightly more difficult first steps and learn special tricks for them, and after a while cubers would be getting FASTER averages on your "competition-grade" scrambles than on random scrambles. Whenever scrambles have to satisfy a restrictive property, you are giving competitors a lot of information about their scrambles before they see them, and that gives people an advantage compared to knowing nothing about a completely random mix.Now this will produce a REAL scramble that has NOTHING already solved, and no cheap solution should even be possible. And it would be nice if these scrambles could be generated at the competition site, with a hardware reseeded rnd# just prior to the actual events.
The total# of these possible "Competition-Grade" scrambles would end up to be a small% of all possible random positions, but still way more than would ever be needed. Some distribution studies would be required before implementing, but I would much prefer something like this, over the random state, but-not-always-so-scrambled state, scramblers, we have now.
This is ridiculous. There will be very few scrambles left after these tests,
and those that ARE left will represent the most difficult (in some sense), not random ones. By generating random positions we are testing people on every type of scramble, not just ones that you think are difficult.
and that gives people an advantage compared to knowing nothing about a completely random mix.
What was the official WCA scramble for these solves?
1) Erik Akkersdijk 0.96 Netherlands, Geneva Open 2008
[F' U' F' R2 F2 R U2 R' U F U R2 U F' U2 F2 R' U R F' R U2 R2 U' F] - Edward Lin
2) Rowe Hessler 1.03 USA, Brown Cubing Day 2009
[R2 F2 U R'] - Kyle Barry
3) Lucas Garron 1.06 Germany, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
4) Cameron Almasi 1.15 USA, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
5) Dan Dzoan 1.33 USA, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
6) Andy Bridger 1.36 USA, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
7) Justin Adsuara 1.36 USA, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
8) Edouard Chambon 1.39 France, Geneva Open 2008
[F' U' F' R2 F2 R U2 R' U F U R2 U F' U2 F2 R' U R F' R U2 R2 U' F] - Edward Lin
9) Antoine Piau 1.46 France, World Championship 2009
[4-move solution (iirc)] - Dan Cohen
10) Tim Reynolds 1.46 USA, Brown Cubing Day 2009
[R2 F2 U R'] - Kyle Barry
11) David Shi 1.47 USA, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
12) Eric Limeback 1.52 Canada, Toronto Open Summer 2009
[could be solved by U2 R U R] - Justin Jaffray
13) Anthony Searle 1.55 Belize, Toronto Open Summer 2009
[could be solved by U2 R U R] - Justin Jaffray
14) John Tamanas 1.55 USA, Brown Cubing Day 2009
[R2 F2 U R'] - Kyle Barry
15) Michal Robaczyk 1.55 Poland, Polish Open 2009
16) Vicente Albíter Alpízar 1.55 Mexico, Mexican Open 2008
17) Javier París 1.63 Spain, MurciaOpen2008
[F' D2 L2 B' D' B R' D' R' U L' B' L2 U' L2 U2 R2 B2 R2 U2 B2 R2 D R2 D2]
18) Michal Pleskowicz 1.66 Poland, Polish Open 2009
[F' U F U2 R'] - Michal Pleskowicz
19) Arnaud van Galen 1.68 Netherlands, Geneva Open 2008
[F' U' F' R2 F2 R U2 R' U F U R2 U F' U2 F2 R' U R F' R U2 R2 U' F] - Edward Lin
20) Jai Gambhir 1.69 Canada, Toronto Open Summer 2009
[could be solved by U2 R U R] - Justin Jaffray
21) Erik Johnson 1.72 USA, US Nationals 2009
22) Justin Jaffray 1.72 Canada, Toronto Open Summer 2009
[could be solved by U2 R U R] - Justin Jaffray
23) Patrick Jameson 1.72 USA, Armonk Spring 2008
[probable solution was U R' U R' U2] - Tim Reynolds
24) Thomas Watiotienne 1.75 France, World Championship 2009
[4-move solution (iirc)] - Dan Cohen
25) Anton Rostovikov 1.77 Russia, World Championship 2009
[4-move solution (iirc)] - Dan Cohen
26) Thompson Clarke 1.77 Canada, Toronto Open Summer 2009
[could be solved by U2 R U R] - Justin Jaffray
27) Jacco Krijnen 1.80 Netherlands, Dutch Open 2009
28) Milán Baticz 1.80 Hungary, Silesia Open 2009
[R U R' F' L F L' U2 L' U2 L] - was solution, Milan Baticz
29) Michael Nguyen 1.86 USA, Stanford Fall 2009
[U' F R2 F' R'] - Ian Jones, David Shi
30) Phil Thomas 1.86 USA, Wisconsin Open 2008
31) Sebastián Pino Castillo 1.86 Chile, Bahia Summer 2010
32) Laetitia Lemoine 1.88 France, World Championship 2009
[4-move solution (iirc)] - Dan Cohen
33) Marwin-Peter Kurth 1.96 Germany, World Championship 2009
[4-move solution (iirc)] - Dan Cohen
34) Timothy Sun 1.96 USA, Xi'an Open 2009
.
(2) Seed the Mersenne Twister with a number generated from SecureRandom
REAL scramble that has NOTHING already solved
So there are two options:
(1) Use only the SecureRandom generator
(2) Seed the Mersenne Twister with a number generated from SecureRandom
I don't know how many, but your conditions are quite restrictive, so I assume it's a very small fraction of the set of cube positions. Someone would need to compute this.How many exactly is "very few"? Do you think you could solve those "very few" in your lifetime?This is ridiculous. There will be very few scrambles left after these tests,
But a huge proportion of the scrambles you are rejecting are NOT "far too easy" in any sense.I don't care about making the scrambles more difficult, or harder for anyone, but just want to reject those that are far too easy (random, but relatively unscrambled).
3x3 is not 2x2.Which would give people the most advantage, the ones I propose, or one of these?
[2x2 stuff...]
So there are two options:
(1) Use only the SecureRandom generator
(2) Seed the Mersenne Twister with a number generated from SecureRandom
I knew SecureRandom, but didn't know about its seeding. Quite cool. And it has the generateSeed() method for precisely your option 2:
http://java.sun.com/j2se/1.4.2/docs/api/java/security/SecureRandom.html#generateSeed(int)
byte[] seed = null;
try{
seed = SecureRandom.getInstance("SHA1PRNG").generateSeed(9);
} catch(NoSuchAlgorithmException e) {
seed = new SecureRandom().generateSeed(9);
}
return randomCube(new MTRandom(seed));
private final static int N = 624;
private final static int M = 397;
private final static int MAGIC[] = { 0x0, 0x9908b0df };
private final static int MAGIC_FACTOR1 = 1812433253;
private final static int MAGIC_FACTOR2 = 1664525;
private final static int MAGIC_FACTOR3 = 1566083941;
private final static int MAGIC_MASK1 = 0x9d2c5680;
private final static int MAGIC_MASK2 = 0xefc60000;
private final static int MAGIC_SEED = 19650218;
private final static long DEFAULT_SEED = 5489L;
qq has mentioned this before, but:
http://www.random.org/
This means you'll need an internet connection to generate scrambles, but if you don't have an internet connection, a number of these could still be stored in advance.
Yup, It's pretty cool that this is provided in the standard Java library
I've used the following code to seed the MTRandom generator:
I chose a seed of 9 bytes (size 2^72), because it is the smallest sequence of bytes which is large enough to access all cube states. The code also prioritises the SHA1 pseudorandom generator, falling back to the system default if it isn't available.Code:byte[] seed = null; try{ seed = SecureRandom.getInstance("SHA1PRNG").generateSeed(9); } catch(NoSuchAlgorithmException e) { seed = new SecureRandom().generateSeed(9); } return randomCube(new MTRandom(seed));
... random.org does impose quota limits, but because only one seed is needed per page load this shouldn't be a problem. The only problem with this (as JBCM pointed out), is that it needs a connection.
I can't find much on it other than this article:I would prefer to seed the random generator only once for example when the program is starting. Reseeding after a few calls/ for every new cube is not recommended as far as I know (but I must admit I cannot explain why).
When adding entropy to a system, it is best to collect a lot of entropy and seed all at once, instead of seeding a little bit at a time. We will illustrate why by example. Suppose you seed a generator with one bit of entropy. An attacker has only one bit to guess, which can be done accurately after two outputs. If the attacker completely compromises the state after two outputs, and we then add another bit of entropy, he can once again guess the state easily.
If we add one bit 128 times, there is still very little security overall if the generator state is compromised. However, if you add 128 bits of entropy to the generator all at once, an attack should essentially be infeasible.
That is a good point... generally you can't httprequest data from another domain.I'm not sure Javascript is allowed to connect to a server other than the one it came from. So asking random.org might not work because of that.
... random.org does impose quota limits, but because only one seed is needed per page load this shouldn't be a problem. The only problem with this (as JBCM pointed out), is that it needs a connection.
If you're using it online, you do have a connection, and if you're using it offline, you did have a connection when you downloaded it. So we could implant a proper random seed at download (using let's say php instead of static html files). You and I downloading the same scrambler would get different seeds. Then when it's run, additionally use the system time to randomize further (don't want the downloaded scrambler generate the same scrambles over and over again).
Also, security restrictions could play a role. I'm not sure Javascript is allowed to connect to a server other than the one it came from. So asking random.org might not work because of that.
I would prefer to seed the random generator only once for example when the program is starting. Reseeding after a few calls/ for every new cube is not recommended as far as I know (but I must admit I cannot explain why).
A simpler approach is to have the user enter a string that's used as a part of the seed.
I would prefer to seed the random generator only once for example when the program is starting. Reseeding after a few calls/ for every new cube is not recommended as far as I know (but I must admit I cannot explain why).
Doh! What a stupid mistake :fp ...I wasn't intending on re-seeding it every time. In the process of fixing now. Thanks for pointing that out ... that really is a big facepalm for me!
A simpler approach is to have the user enter a string that's used as a part of the seed.
This is the best solution by far.