The only way of coding the deck that I can think of that doesn't involve a set shuffled deck for the individual match is to have the deck in the deck manager placed into an array. The drawing function would then randomly pick from this array and replace picked cards with a null or 0 (so that it doesn't try and draw them again). This would lead to an (almost) even chance for individual cards to be picked.
To increase the chances of a card being picked the game would have to have a branch watching for this skill and then once triggered compute 5% of the remaining number of cards left in the array, increase the size of the array by that size and fill those new slots with copies of the target card. Once the target card is picked it would have to reduce the array size to the original size of the deck. All of this creates very complex messy code to add into what is probably already very complex code.
This leads me to believe that as others have said that the deck used in game is set for the match with the cards in the deck manager randomly stored in either an array that draws from the top or (much more likely) a stack, leaving no way to increase % chances of drawing a card.
Zblader's desync issue was most likely caused by the AI playing different cards than he did since his opponent couldn't actually see what he drew
As a suggestion maybe make the ability something like "put target card on top of deck if any are left in deck". This would be much simpler coding and more useful IMO